【发布时间】:2012-01-14 22:38:44
【问题描述】:
我有一个向用户显示 Web 表单的 php 脚本。当用户提交表单时,我将数据保存在数据库中,然后我创建一个子进程,向受新更改影响的数据库用户发送一些 SMS。
当我fork时,我检查了儿子,他正确发送了SMS,最后退出了。 但出于某种原因,父亲等待儿子完成他的任务。我不知道为什么会这样..
这是我的代码示例:
// before this point, i've inserted some data in the database, and now i commit the transaction
$conn->commit();
$pid = pcntl_fork();
if ($pid == 0) { // its the son, so he will send the messages
$conn = new PDO('oci:dbname='.SERVER.';charset='.CHARSET, DATABASE, PASSWORD);
$suppliersPhoneNumber = getSuppliersPhoneNumber($conn, ...);
$conn = null;
$sms = new MessageSender($suppliersPhoneNumber, $_POST['subCategory']);
$sms->handleMessages(); // send the sms
//sleep(60);
exit(0); // the son won't execute more code
}/
代码“sleep(60)”的那一行是我知道父亲在等孩子的方式。但是,如果儿子退出,这怎么可能?我知道父亲在等儿子,因为实际上我的脚本冻结了 1 分钟,等待时间。
我的想法是让父亲在数据库中插入所需的数据,最后他产生一个新的孩子来发送消息,但不等待他,所以我们可以向用户发送一个响应页面说一切都很好,而消息正在有效地发送。
这里出了什么问题?
提前考虑
编辑 问题没有解决,而是我按照下面注册的 Paulo H. 的解决方案。确实这是一个更好的方法。
【问题讨论】:
-
这并不是您问题的真正答案,但是由于继承的资源,分叉附加到 Apache(或其他一些 Web 服务器)的 PHP 进程很复杂。就个人而言,我会在每次提交表单时创建一个数据库表并在其中插入一行。使用 CRON,您可以每分钟运行另一个 PHP 脚本来检查此表中的新条目并为每个新条目发送 SMS。对我来说,这是一种更简单的解耦后台逻辑的方法。