【问题标题】:Setting up php-sdk-gae with symfony2使用 symfony2 设置 php-sdk-gae
【发布时间】:2013-05-19 08:01:29
【问题描述】:

我正在尝试使用 php-sdk-gae 中的 hello world 示例包运行 symfony2。

我按照https://developers.google.com/appengine/docs/php/ 中提供的说明进行操作,我可以使用开发控制器运行演示(即:如下配置 app.yaml:

application: helloworld
version: 1
runtime: php
api_version: 1

handlers:
- url: /bundles
  static_dir: helloWorld/web/bundles

- url: /favicon.ico
  static_files: helloWorld/web/favicon.ico
  upload: helloWorld/web/favicon.ico

- url: /.*
  script: helloWorld/web/app_dev.php

它工作正常,运行服务器并加载 /hello/World 页面后我可以得到一个 Hello World

但是当我尝试使用生产控制器(app.php 而不是 app_dev.php)运行它时,我得到一个内部服务器错误。

Request URL:http://mysite.local:8080/hello/World
Request Method:GET
Status Code:500 Internal Server Error

唯一的线索是在我启动服务器的控制台窗口中,显示行...

ERROR:root:php failure (255) with:
Status: 500 Internal Server Error
X-Powered-By: PHP/5.4.15
Content-type: text/html

如果我对 app.php 文件进行一些更改,我意识到它可以很好地与以下 AppKernel 加载行配合使用:

$kernel = new AppKernel('prod', true);
$kernel = new AppKernel('dev', false);
$kernel = new AppKernel('dev', true);

但不适用于生产环境的默认配置 ('prod',false)。

我正在使用以下命令启动 GAE 服务器: google_appengine/dev_appserver.py --php_executable_path=/home/jon/php-sdk-gae/php-5.4.15/installdir/bin/php-cgi helloWorld/

我是 GAE 的新手,我想知道在哪里可以找到日志以获取有关此错误的更多信息。

【问题讨论】:

  • 请提供您的 app/logs/prod.log 的某些部分。 http 500 应该是由生产中的异常引起的......哪一个?
  • 你使用的是哪个版本的 symfony?
  • 我使用的是 symfony 2.2

标签: php google-app-engine symfony


【解决方案1】:

我认为问题在于 GAE 对文件系统的写入支持不足。此外,symfony 似乎依赖于 tempnam() 函数,该函数在低于 1.9.18 的版本中被禁用,在我写这篇文章的时候还没有公开。

【讨论】:

    【解决方案2】:

    缓存也有问题。

    也许问题是这样的,我在localhost中尝试了一个开发版本的项目,好吧。当它部署到 GAE 时,它会失败。

    也许这有帮助。 http://www.ideato.it/planet-ideato/symfony2-su-google-app-engine/

    【讨论】:

      【解决方案3】:

      问题与 Symfony 2.2 附带的 .htaccess 文件有关

      我可以毫无问题地使用 symfony 2.0 中的应用程序,如果我将 Symfony 2.2 附带的 web/.htaccess 文件替换为 Symfony 2.0 附带的文件,我的 Symfony 2.2 应用程序也可以工作

      也许这与为了避免重复内容(/app.php/something 和 /something)所做的更改有关,因为从 Symfony 2.2 开始,/app.php 重定向(301)请求。

      【讨论】:

        【解决方案4】:

        您的生产环境中有一个未捕获的异常。这就是 http 500 错误的原因。

        让我快速解释一下AppKernel::__construct

        $kernel = new AppKernel($environment, $debug);
        

        第一个参数是环境,第二个是调试选项。

        如果您将 debug 设置为 true ,symfony 将尝试捕获异常并向您显示一个漂亮的 stracktrace。

        这涵盖了您没有收到 http 500 错误(由未捕获的异常引起)的第一种和第三种情况。

        $kernel = new AppKernel('prod', true);
        $kernel = new AppKernel('dev', true);
        

        现在您声明在调试设置为 false 的开发环境中不会引发错误。

        $kernel = new AppKernel('dev', false);
        

        这意味着在开发环境中没有例外

        现在您必须检查生产日志文件以找出引发了哪个异常。

        使用 tail -f 查看在您的 shell(即 bash)中对该文件所做的实时更改,或者如果不可用,请在您的编辑器中打开该文件并在最后查找异常。

        tail -f app/logs/prod.log 
        

        在 symfony2 标准版的日志文件可以在

        找到
        app/logs/%kernel.environment%.log  
        

        ... %kernel.environment% 是 dev/prod/test 之一

        【讨论】:

        • 我试图深入研究这个日志(logs/prod.log & logs/dev.log),但是,当我强制错误时,prod.log 中没有行当我运行时内核在开发模式下,dev.log中有一些行,但没有错误行,因为在开发环境中没有错误。它显示“Hello World!”消息成功。我怀疑生产环境中存在一些 GAE 无法完成的操作(例如缓存文件或类似的东西)
        • 请确保您的路线输出Hello World!不仅在 routing_dev.yml 中配置 - 你能确认一下吗?
        • 我可以确认这一点。它在 routing.yml 中。它适用于 AppKernel('prod',true) 配置,但不适用于 AppKernel('prod',false)
        • 您是否尝试过使用本地 apache/nginx 安装的项目,并且可以确认它可以与那里的 AppKernel('prod', false) 一起使用?
        • 它适用于 apache 访问方式:mysite.local/app_dev.php/hello/Worldmysite.local/hello/World(它不适用于 mysite.local/app.php/hello/World,因为 sf2.2 中的 .htaccess 发生了变化)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多