我有一个脚本可以从数据库中提取用户,准备一条 XMPP 消息,遍历每个用户并发送 XMPP 消息,然后记录消息已发送。轻松运行超过 1000 个用户。这是从移动设备调用的服务器端 API 脚本。移动设备正在等待接收成功的 JSON 响应。用户体验应该很快,我不希望移动用户等待超过几秒钟的响应。
问题是脚本需要相当长的时间来遍历所有用户,所以我最初的解决方案是使用 ob_flush() - 注意这些只是测试脚本,看看计划的方法是否有效:
ob_start();
$profiles_ar = array(
"reach" => 30,
);
$return_ar = array(
"success" => $profiles_ar['reach'],
);
echo json_encode($return_ar);
$buffer = str_repeat(" ", 4096); // Note apparently the buffer must be "filled" with 4096 characters (bytes?) for ob_flush() to work before sleep() occurs.
echo $buffer;
ob_flush();
flush();
for($i=0;$i < $profiles_ar['reach']; $i++)
{
sleep(1);
}
echo "finshed: ".$i;
ob_flush();
flush();
这不起作用,在脚本完成之前没有任何输出 - 我错过了 OB 技术吗?
......所以做了一些搜索并想出了这个:
register_shutdown_function('process_after');
$profiles_ar = array(
"reach" => 10,
);
$return_ar = array(
"success" => $profiles_ar['reach'],
);
echo json_encode($return_ar);
echo $buffer;
exit;
function process_after()
{
global $profiles_ar;
for($i=0;$i < $profiles_ar['reach']; $i++)
{
sleep(1);
}
echo "finshed: ".$i;
}
这个适用于mac,但不适用于服务器....
有人有什么想法吗?如果我不能在主处理工作之前获得这种输出响应 JSON 的技术,那么我唯一的希望是在数据库中建立一个队列并运行一个 cron 作业........ ;(