【发布时间】:2011-02-08 10:55:47
【问题描述】:
免责声明
首先,我知道这个问题(或相近的变体)已经被问过一千次了。我确实花了几个小时寻找明显和不那么明显的地方,但我可能遗漏了一些小东西。
背景
让我更清楚地定义问题:我正在编写一个时事通讯应用程序,我希望实际的发送过程是异步的。例如,用户单击“发送”,请求立即返回,然后他们可以检查特定页面中的进度(例如通过 AJAX)。它是在您的传统 LAMP 堆栈中编写的。
在我使用的特定主机中,出于安全原因,PHP 的 exec() 和 system() 被禁用,但 Perl 的系统函数(exec、system 和反引号)没有。所以我的 workaround 解决方案是在 Perl 中创建一个“触发”脚本,通过 PHP CLI 调用实际的发送者,并重定向到进度页面。
我被困在哪里
截至目前,发件人的电话所在的那一行:
system("php -q sender.php &");
问题是,它不是立即返回,而是等待脚本完成。我希望它在后台运行并让系统调用本身立即返回。我还尝试在我的 Linux 终端中运行一个类似的脚本,实际上直到脚本完成后才会显示提示,即使我的测试输出没有运行,表明它确实在后台运行。
我已经尝试过的
- Perl 的 exec() 函数 - system() 的结果相同。
- 将命令更改为:“php -q sender.php | at now”),希望“at”守护进程能够返回,并且 PHP 进程本身不会附加到 Perl。
- “间接”执行命令:“/bin/sh -c 'php -q sender.php &'” - 仍然等到 sender.php 完成发送。
- fork()'ing 进程并在子进程(希望分离进程)中执行系统调用 - 结果与上述相同
我的测试环境
为了确保我没有遗漏任何明显的东西,我创建了一个 sleeper.php 脚本,它在退出前只休眠五秒钟。还有一个像这样的 test.cgi 脚本,逐字逐句:
#!/usr/local/bin/perl
system("php sleeper.php &");
print "Content-type: text/html\n\ndone";
我现在应该尝试什么?
【问题讨论】:
标签: php perl unix background