大家好。
我有一个通过 AJAX 调用脚本的页面,该脚本调用 prestashop 网络服务并且必须一次插入多个项目。我的问题是脚本大部分时间似乎“卡住”,然后在 2 或 3 分钟后开始打印结果,并从最后继续。我想做的是每次插入一个项目时从脚本中检索一些东西,而不是“缓冲”数百个结果然后一次查看所有结果。
这是我正在使用的代码(去除了不必要的部分)。
<?php
function PS_new_product(all product attributes) {
global $webService;
try {
$opt = array('resource' => 'products');
$opt['postXml'] = $xml -> asXML();
$xml = $webService -> add($opt); //this should return each product state (if it's inserted or not)
return true;
} catch (PrestaShopWebserviceException $ex) {
return false;
}
}
function inserisciProdottiRAW(){
set_time_limit(30);
$sql_prodotti = "SELECT everything i need to import";
if ($prodotti = mysql_query($sql_prodotti)) {
while ($row = mysql_fetch_assoc($prodotti)){
$webService = new PrestaShopWebservice(PS_SHOP_PATH, PS_WS_AUTH_KEY, DEBUG);
$opt = array('resource' => 'products');
$opt['filter[reference]'] ="[".$row["modello"]."]";
$xml = $webService->get($opt);
$prodotto = $xml->children()->children();
if ($prodotto->product[@id] == ""){
PS_new_product(/*all product attributes*/)
}
}
}
echo "ok";
}
inserisciProdottiRAW();
?>
我想要一些我可以在我调用它的页面中捕捉到的东西,例如它在特定时间到达了哪些项目......这可能吗?或者我必须实现一些东西来计算每... mh ... 30 秒插入数据库中的项目?
最佳答案
如果您需要一个快速而肮脏的解决方案 - 只需在每次插入后包含一个 echo 并确保它包含新行并且足够大以刷新 php/apache 中的缓存(4KB 应该可以做到)。例如使用此方法:
function logProgress($message)
{
echo($messsage);
for ($i=0; $i<4096; $i++)
{
echo(" ");
}
echo("\n");
}
如果您使用 gzip,那么它还不够,还可以使用其他随机空白字符。
如果你想向某些用户显示进度,那么你可以在后台运行你的插入脚本,将状态保存在一些数据库表中并从不同的脚本中轮询它。
运行后台作业可以使用 fork 完成功能, curl 或者如果你需要好的工作经理,试试gearman .
另请注意,如果您使用 session ,则不能同时运行 2 个脚本 - 一个将等待另一个完成。如果您知道您不会再在脚本中使用 session ,则可以调用 session_close() 来解决这个锁定问题。
关于php - ajax 调用如何在使用 PHP 长时间执行期间检索部分结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22179138/