【问题标题】:Unix/Windows, Setup background process? from php codeUnix/Windows,设置后台进程?从 php 代码
【发布时间】:2012-03-04 09:01:39
【问题描述】:

于是我从http://php.net/manual/en/function.exec.php找到了一个函数

function execInBackground($cmd) {
if (substr(php_uname(), 0, 7) == "Windows"){
    pclose(popen("start /B ". $cmd, "r")); 
}
else {
    exec($cmd . " > /dev/null &");  
}
}

Windows 使用情况:

pclose(popen('start /B php path/to/background_cron.php', 'r'));

Unix 用法:

exec('php path/to/background_cron.php >> path/to/background_error.log &')

但是当这些行被调用时,实际上什么都没有发生(等待 5 分钟左右之后)。难道我做错了什么?在激活这些行之前,我有一个 file_exists 检查我的 path/to/background_cron.php 是否存在,如果不存在,它将返回错误。

在实时 unix 服务器上,所有者、组、公共 (0755) 的所有文件夹权限设置为写入、读取、执行,所有者、组、公共 (644) 的文件权限设置为读取。在 unix 命令运行后,background_log 为空,它创建了 4 个新的空白行 (\n),但不返回任何期望

【问题讨论】:

  • 我还稍微修改了函数,添加了一个 try catch 以查看是否捕获了任何异常,但它很清楚。
  • 我已经将它设置为绝对值,当我在 apache windows 服务器上测试它时,它正在从 C:\ 驱动器调用 background_cron,当我在实时服务器上运行代码时它正在从 unix 服务器上的网站域调用它

标签: php windows unix exec popen


【解决方案1】:

在 Windows 中有点奇怪的是,由于网络服务器以不同的用户身份运行,它会在自己的用户空间中启动应用程序 - 而不是您的桌面。

该进程可能正在启动,但不在您的进程列表中 - 请检查所有用户。另外,检查事件日志以防它试图运行但抛出异常

另一种可能性是 Web 用户没有执行命令的权限 - 查看应用程序池的运行身份并检查他们对这些文件夹的权限。

注意不要让网络服务器运行任意代码而造成安全漏洞。

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多