Google — App Engine — API Предупреждение: mkdir (): локальная файловая система доступна только для чтения, сбой mkdir — разрешить локальной файловой системе создать каталог

В библиотеке google-api-php-client есть файл с именем File.phpи этот файл находится в src/Google/Cache каталог. Этот файл возвращает ошибку из строки 149:

if (! mkdir($storageDir, 0755, true)) {

Ошибка:

Предупреждение: mkdir (): локальная файловая система доступна только для чтения, сбой mkdir в C: \ Users \ NoName \ Documents \ acade-Being-90217 \ google-api-php-client \ src \ Google \ Cache \ File.php в строке 149

Я тестирую код, запустив его из Google App Engine Launcher на моем локальном компьютере.

Очевидно, моя локальная файловая система не позволяет PHP создавать каталоги. Как я могу позволить PHP сделать каталог? Я использую Windows 7.

В документации PHP говорится:

Замечания:
режим игнорируется в Windows.

в Client.php файл, Google_Client у класса есть метод isAppEngine(), В качестве теста я запустил этот метод (локально с моего компьютера), и он ничего не дал. Так, . , , на моем компьютере, тестируя проект App Engine, google-api-php-client не обнаруживает, что это для App Engine. Если бы он работал на App Engine, когда $config объект создается, он проверяет, выполняется ли код в App Engine, и

// Автоматически используем Memcache, если мы находимся в AppEngine.

if ($this->isAppEngine()) {
// Automatically use Memcache if we're in AppEngine.
$config->setCacheClass('Google_Cache_Memcache');
}

Итак, мне интересно, если причина того, что код пытается создать новый каталог на моем компьютере, заключается в том, чтобы использовать его для кэширования, потому что он не обнаружил, что код работает на App Engine. (что это не так)

Думаю, я мог бы развернуть проект разработки на App Engine и протестировать функциональность OAuth2 с помощью операторов echo. Мне нужно постоянно развертывать каждый раз, когда я хотел проверить. Если OAuth работает, очевидно, мне не нужно ничего менять. Но как я буду тестировать новые версии локально на моей машине, если я не могу авторизовать OAuth2?

Я развернул следующий код в App Engine и запустил код с сервера. Это не отображало ошибку в браузере. Затем я обновил окно и получил сообщение изнутри IF проверьте, что сервисный токен был установлен. Итак, похоже, что он авторизует мое приложение как сервис. Итак, я предполагаю, что поскольку я запускал код из App Engine, он использовал Mem Cache вместо создания каталога Cache и сохранения данных в файл.

<?php
session_start();

//The php file loaded below outputs information to the user in the browser
include_once "templates/base.php";
//The autoload.php file loads the entire API library I think.  It avoids needing to call specific files.
require_once realpath(dirname(__FILE__) . '/google-api-php-client/src/Google/autoload.php');

//The following three lines are the credentials
$client_id = 'my ID here.apps.googleusercontent.com'; //Client ID
$service_account_name = 'My name [email protected]'; //Email Address
$key_file_location = 'Test Project-file-name.p12'; //key.p12

//Display a page header to the user in their browser
echo pageHeader("Service Account Access");

//Check if the credentials are present and assigned to their variable names
if (!strlen($client_id)
|| !strlen($service_account_name)
|| !strlen($key_file_location)) {
echo missingServiceAccountDetailsWarning();
}

//The Google_Client Class is in file Client.php
//Create a Google_Client object and use it to acquire an access token
$client = new Google_Client();
/*
foreach($client as $key => $value) {
echo $key." - ".'<br>';
}
*/

//The object $client was just created in the above line of code.  Call the function 'setApplicationName' that is inside of
//the $client object.
$client->setApplicationName("Client_Drive_Examples");

$service = new Google_Service_Drive($client);

/************************************************
If we have an access token, we can carry on.
Otherwise, we'll get one with the help of an
assertion credential. In other examples the list
of scopes was managed by the Client, but here
we have to list them manually. We also supply
the service account
************************************************/
if (isset($_SESSION['service_token'])) {
echo 'There is a service token';

$client->setAccessToken($_SESSION['service_token']);
}

$key = file_get_contents($key_file_location);

//echo 'the $key: ' . $key;
//echo '$service_account_name: ' . $service_account_name;

/*
https://www.googleapis.com/auth/drive - View and manage the files in your Google Drive
https://www.googleapis.com/auth/drive.file - View and manage files that you have created with this app
https://spreadsheets.google.com/feeds/ - Manage your spreadsheets
*/
$scopes = array('https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.file');

$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
$scopes,
$key
);

$client->setAssertionCredentials($cred);

if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}$_SESSION['service_token'] = $client->getAccessToken();

echo 'end of code';
?>

0

Решение

App Engine не поддерживает создание каталогов динамически.

2

Другие решения

Это вроде как. Вы просто добавляете пути к каталогам к имени файла, и у него есть новое длинное имя файла, но оно выполняет то же самое, обеспечивая обратную совместимость со старыми файлами max для каждой файловой системы типа папок, предполагая, что вы разветвляете свой код для среды

1

По вопросам рекламы [email protected]