代码之家  ›  专栏  ›  技术社区  ›  jeffreynolte

脚本头过早结束:php5 symfony产生内部服务器错误500

  •  3
  • jeffreynolte  · 技术社区  · 16 年前

    我遇到了一个问题,让我走到死胡同,所以反过来,我转向你!最近,一个symfony应用程序出现了内部apache错误-500。删除symfony缓存后,站点会恢复。在进一步调查之后,我发现了“脚本头过早结束:php5”的错误。在过去的1年中,该站点没有出现任何类似的错误,我们也没有对此站点进行任何更改,并且这种情况经常发生(每周一次)。以下内容来自日志文件。

    [Sat Aug 28 06:20:30 2010] [error] [client 206.131.184.1] Premature end of script headers: php5
    

    这封邮件也是最近从mt发来的,可能与我认为可能与问题直接相关。

    我们注意到,您的服务----.com在承载您的帐户的集群上生成了异常大量的文件系统锁。错误地使用NFS文件锁定的网站或脚本通常会生成此错误,这会严重影响其他客户群集的性能。这违反了我们的资产管理计划,可在 http://mediatemple.net/company/legal/aup_general.php '.

    我们将文件锁定问题跟踪到以下重复锁定的文件:

    /域/---.com/symfony/cache/frontend/prod/config/routing/symfony.routing.configuration.cache /域/---.com/symfony/cache/frontend/prod/config/routing/symfony.routing.data.cache

    如果选项可用(通常位于脚本的配置部分),我们建议您立即禁用脚本的文件锁定;或者使用不使用文件锁定的其他脚本。此脚本将来的任何锁定滥用都可能导致到此域的流量暂停,以防止锁定影响其他客户。

    如果您对此文件锁定问题有任何疑问,或者不确定从何处开始禁用文件锁定,请响应此通知单以获得进一步帮助。

    3 回复  |  直到 13 年前
        1
  •  1
  •   Jakub Zalas    16 年前

    最近我遇到了类似的问题。用apc替换文件缓存完全解决了我的问题。我需要替换视图缓存、i18n缓存和路由的sffilecache。

    如果APC在您的服务器上不可用,那么您可以轻松地使用任何其他流行的加速器。

    如何在symfony中使用apc: http://www.zalas.eu/symfony-meets-apc-alternative-php-cache

        2
  •  11
  •   mYkon    13 年前

    只有当您使用Google Chrome浏览并且抛出异常时,才会发生这种情况。 在Monolog中有一些变化的地方,它们启用了“chromephp”。

    在配置中:

    monolog:
    handlers:
        main:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: debug
        firephp:
            type:  firephp
            level: info
        chromephp:
            type:  chromephp
            level: info
    

    移除整个Chromephp模块,一切正常。

        3
  •  2
  •   jmz    16 年前

    我认为你可以安全地禁用symfony的缓存锁定来读取 lib/cache/sfFileCache.class.php 在方法中 read() . symfony在阅读时使用共享锁。不需要锁,因为symfony在写入时使用临时文件并重命名。此外,在 lib/log/sfFileLogger.class.php 锁在 doLog() 方法不是必需的,因为写入是原子的(单个 fwrite() 调用),文件以附加模式打开。

    我还没有测试这些变化对symfony的影响。

    “脚本头过早结束”不是PHP错误消息。当后端(本例中为PHP)不发送头时,Web服务器将发出此消息。这很可能是因为它在做任何事情之前就死了。您应该找到php错误日志并看到真正的错误消息。但是,请注意symfony使用了很多 @ 函数调用中的错误抑制,因此可能找不到任何内容。