2013-02-27 60 views
1

我有一个脚本,用于从数据库中提取用户,准备XMPP消息,循环遍历每个用户并发送XMPP消息,然后记录消息发送的日志。轻松运行1000个用户。这是从移动设备调用的服务器端API脚本。移动设备正在等待收到成功的JSON响应。用户体验应该很快,我不希望移动用户等待超过几秒钟的响应。PHP,Apache。在脚本完成之前对浏览器的输出响应

问题是其考虑的时间相当数量的脚本遍历所有用户,所以我最初的解决方案是使用使用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的技术,那么我唯一的希望就是在DB中建立队列并运行cron作业........;(

回答

1

是在php.ini output_buffering启用? http://php.net/manual/en/outcontrol.configuration.php

我会重构XMPP消息的创建在它自己的文件,然后使用AJAX调用发送每一个。你是不是在每封邮件等待这样才能成功。

+0

经检查发现其没有价值,会看到什么样的设置它。 FYI AJAX方法不会有什么好处,因为这个过程必须是100%的服务器端。 – Nick 2013-02-27 19:23:06

+0

你可以让ajax调用服务器端,用ajax调用创建一个html文件,并通过file_get_contents()加载它 – 2013-02-28 17:34:27

+0

服务器端Ajax调用如何帮助保持这个PHP脚本去输出到应用程序?林不知道我跟随你的想法使用Ajax? – Nick 2013-02-28 20:32:04

1

解决方法是补充:

echo " "; 
    ob_flush(); flush; 

内循环....

ob_start(); 

$profiles_ar = array(
    "reach" => 10, 
); 

$return_ar = array(
    "success" => $profiles_ar['reach'], 
); 

echo json_encode($return_ar); 

for($i = 0; $i < 5000; $i++) 
{ 
    echo " "; 
    ob_flush(); flush; 
} 

echo $buffer; 

ob_flush(); 

flush(); 

ob_end_flush(); 

for($i=0;$i < $profiles_ar['reach']; $i++) 
{ 
    sleep(1); 
} 

echo "finshed: ".$i; 

ob_flush(); 

flush(); 

ob_end_flush(); 

这迫使反复从循环的第一次迭代的输出,并最终踢英寸

相关问题