【问题标题】:Getting PHP processing to happen in the background让 PHP 处理在后台发生
【发布时间】:2011-10-27 11:08:04
【问题描述】:

我正在开发一个 PHP 网站,我正在将它转移到一个新的服务器上。我要迁移到的新服务器不具备 CRON 兼容性。为了弥补这一点,我设计了一个使用时间格式和数据库表等的系统来运行我的代码。

我遇到的问题是这段代码:

if ($lasttime < $pretime)
{
    $newtime = strtotime("now");

    queryMysql("UPDATE time SET time=".$newtime." WHERE time=".$lasttime);

    include_once 'grabber/grabber.php';
}

具体来说是include_once 'grabber/grabber.php'; 导致了问题。当计时器到来并且此代码运行时,它会到达包含然后代码停止,没有提供错误,因此包含失败。我曾尝试将其更改为exec(),但老实说,我并不完全了解exec() 的工作原理以及它是否正确。我是这样使用的:

if ($lasttime < $pretime)
{
    $newtime = strtotime("now");

    queryMysql("UPDATE time SET time=".$newtime." WHERE time=".$lasttime);

    $grabber = $base."grabber/grabber.php";    

    exec($grabber);
}

这不会停止代码并且似乎可以运行但实际上并不能正常工作,如果grabber/grabber.php 运行正确,那么我会收到一封电子邮件以确认使用 PHP mail() 函数

如果有人可以帮助我解决这个问题或提供一些启发,那就太好了。 谢谢。

【问题讨论】:

  • 也许试试完整版的 exec? exec ($grabber,$output,$return_code) 看看 $output 返回什么?
  • @charlesbridge 使用exec 意味着代码可以运行而不会导致加载时间变慢?同样在这种使用“完整版”的情况下,我会在$output$return_code 中添加什么?
  • 您应该看到手册页 (us3.php.net/manual/en/function.exec.php),$output 和 $return_code 是空变量,在完成时由 exec 填写。还有一些示例代码可以帮助您。

标签: php include cron exec background-process


【解决方案1】:

这很可能是文件位置或权限的问题。应该有某种错误,或者代码没有停止,但是您没有正确检查,或者grabber.php 本身的代码存在某种问题。添加一些调试行 - 打印文件名,以便您检查路径/名称中的错误;在include_once 行上方的某处添加error_reporting(E_ALL); ini_set('display_errors', true);;确保文件是您尝试打开它的位置,考虑到相对路径等。确保您有权运行此文件。

exec() 在这种情况下不是您所需要的,至少不是您尝试使用它的方式。

如果这没有帮助,请提供更多信息,说明如何运行已显示的脚本、grabber.php 文件中的内容、遇到的错误等。

【讨论】:

  • 感谢您,将 error_reporting 添加到其中表明我有一个重复的功能,该功能在包含到主网站时会停止页面运行。我已经解决了这个问题,现在一切正常。谢谢阿甘
  • 不客气。请记住,将ini_set('display_errors', true);error_reporting(E_ALL);error_reporting(E_ALL &amp; ~E_NOTICE); 或类似的东西放在类似的情况下几乎是您需要做的第一件事。在开发过程中始终使用此设置是个好主意,因此如果发生错误,您可以立即看到它是什么。
  • 是的,它只是这个新的服务器是完全不同的,它是一个云服务,所以做错误报告,更像其他标准服务器。
【解决方案2】:

(假设您的服务器是 *nix)如果您想使用 exec(),您需要在指向 PHP 可执行文件的脚本顶部放置一个 hashbang,并为其授予执行权限。

或者(这可能是更好/更便携的方法),改变

$grabber = $base."grabber/grabber.php";    
exec($grabber);

$grabber = "php ".$base."grabber/grabber.php";    
exec($grabber);

...就像从终端运行它一样。

但是,我怀疑这会解决问题 - 我认为答案更有可能是以下情况之一:

  • grabber.php 中的解析错误。请记住,主要 PHP 版本之间存在细微的语法差异 - 如果您的 PHP 版本在您的旧/新主机上有所不同,这可能是问题所在。
  • 由于 PHP 版本或安装的扩展程序不同,调用了在旧主机上定义但未在新主机上定义的函数
  • grabber.php 在服务器之间移动期间损坏

尝试使用include_once,但请使用ini_set('display_errors',1); error_reporting(-1); 以确保您确实看到任何错误。你怎么称呼你的主脚本?您将如何查看错误?使用此信息编辑问题,您认为来自 grabber.php 的任何代码可能相关,我将扩展此答案。

【讨论】:

  • 谢谢你的回答,我会给你建议一试。我知道grabber.php 没有问题,就像我在浏览器中输入完整的网址一样,它运行正常,数据库更新并且我收到了确认电子邮件,所以问题仅出在includeexec
猜你喜欢
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
相关资源
最近更新 更多