繁体   English   中英

在 Google App Engine 上部署 Laravel - 灵活

[英]Deploy Laravel on Google App Engine - Flexible

将 Laravel 6 部署到 Google App Engine 后,运行 url https://PROJECT_ID.appspot.com/时出现此错误。

The stream or file "/app/storage/logs/laravel-2019-12-31.log" could not be opened: failed to open stream: Permission denied

在此处输入图片说明

我遵循了https://cloud.google.com/community/tutorials/run-laravel-on-appengine-flexible 2 上给出的说明

这是我的app.yaml文件

runtime: php  # language of the app
env: flex     # let app engine know we use flexible environment
runtime_config:
 document_root: .   #folder where index.php is
# Ensure we skip ".env", which is only for local development
skip_files:
 - .env #we want to skip this to make sure we don’t mess stuff up on the server
env_variables:
 # Put production environment variables here.
 APP_ENV: production   # or production
 APP_DEBUG : true # or false 
 APP_KEY: YOUR_API_KEY
#go to generate app key paragraf in this tutorial
 CACHE_DRIVER: database
# instead of putting the cache in the database I recommend using redis
 SESSION_DRIVER: database #or file since both work
 APP_LOG: errorlog
 APP_TIMEZONE: UTC #your timezone of choice
# follow the part of the tutorial on setting up your SQL database
 DB_CONNECTION: mysql
 DB_HOST: localhost
 DB_DATABASE: XXX
 DB_USERNAME: XXX
 DB_PASSWORD: XXX
 DB_SOCKET: /cloudsql/YOUR_CLOUDSQL_CONNECTION_NAME
 QUEUE_DRIVER: database #in case you execute queued jobs
 MAIL_DRIVER: mail
 MAIL_HOST: smtp.sparkpostmail.com
 MAIL_PORT: 587
 MAIL_USERNAME: null
 MAIL_PASSWORD: null
 LOG_DELETE:  true # this is a parameter added by us in the project .env file. You can add here any setting you would add to your .env file
 GOOGLE_VISION_PROJECT_ID : PROJECT_ID
#we need this for the flex environment
beta_settings:
   # for Cloud SQL, set this value to the Cloud SQL connection name,
   # e.g. "project:region:cloudsql-instance"
   cloud_sql_instances: "YOUR_CLOUDSQL_CONNECTION_NAME"  

作曲家.json

"scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ],
        "post-install-cmd": [
           "Illuminate\\Foundation\\ComposerScripts::postInstall",
           "@php artisan optimize",
           "chmod -R 755 storage bootstrap\/cache"
       ],
       "post-update-cmd": [
           "Illuminate\\Foundation\\ComposerScripts::postUpdate",
           "@php artisan optimize"
       ]
    }

我已经在本地机器上测试过并且成功运行。

在 App Engine Flex 环境中,您无法写入文件,因为文件系统是只读的。 不过有一个很好的解决方案,因为您可以将 Stackdriver Logging集成到 Laravel 中。

您需要执行以下命令:

composer require google/cloud-logging google/cloud-error-reporting

此外,您需要更改app/Exceptions/Handler.php文件中的report功能:

/**
 * Report or log an exception.
 *
 * @param  \Exception  $exception
 * @return void
 */
public function report(Exception $exception)
{
    if (isset($_SERVER['GAE_SERVICE'])) {
        Bootstrap::init();
        Bootstrap::exceptionHandler($exception);
    } else {
        parent::report($exception);
    }
}

在文件顶部你需要添加use Google\\Cloud\\ErrorReporting\\Bootstrap;

在您的app.yaml您需要将以下内容添加到env_variables

LOG_CHANNEL: stackdriver

logging.php您需要将以下内容添加到'channels'数组中:

'stackdriver' => [
    'driver' => 'custom',
    'via' => App\Logging\CreateStackdriverLogger::class,
    'level' => 'debug',
],

您需要做的最后一件事是在app/Logging目录中创建CreateStackdriverLogger类:

<?php

namespace App\Logging;

use Google\Cloud\Logging\LoggingClient;
use Monolog\Handler\PsrHandler;
use Monolog\Logger;

class CreateStackdriverLogger
{
    /**
     * Create a custom Monolog instance.
     *
     * @param array $config
     * @return \Monolog\Logger
     */
    public function __invoke(array $config)
    {
        $logName = isset($config['logName']) ? $config['logName'] : 'app';
        $client = new LoggingClient([
            'projectId' => 'YOUR-PROJECT-ID'
        ]);

        $psrLogger = $client->psrLogger($logName);

        $handler = new PsrHandler($psrLogger);
        $logger = new Logger($logName, [$handler]);

        return $logger;
    }
}

现在,您的所有日志都会转到 Stackdriver 系统。

流或文件“/app/storage/logs/laravel-2019-12-31.log”无法打开:无法打开流:权限被拒绝

正如这篇文章中提到,这个错误背后的原因可能是因为directory permissions

storage 和 bootstrap/cache 目录中的目录应该可以被你的 web 服务器写入,否则 Laravel 将无法运行。

您将在以下两篇文章中找到有关它的更多信息:

我希望它有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM