我有一个脚本的问题,我需要从远程API收集信息,我的脚本工作正常时,只有几行数据说200行,但一旦我尝试运行更大的数据集,页面最终显示超时消息,当我看我的日志,它说的唯一有用的东西是500的错误代码。
我试过增加内存限制,执行时间和输入时间,看看这是否会解决问题,但到目前为止,我还没有把我的脚本张贴在下面,如果有人能看到我做错了什么或远程处理大文件的方法,我将非常感激。
<?php
set_time_limit (0);
ini_set('memory_limit','128M');
ini_set('max_execution_time','999');
ini_set('max_input_time','999');
load site settings
require_once ('config.php');
$id = mysql_real_escape_string($_GET['pr']);
$q = mysql_query("SELECT * FROM ".PREFIX."pings WHERE holderID='$id'") or die(mysql_error());
while(false !== ($r = mysql_fetch_assoc($q))) {
$response = file_get_contents("https://secure.comcetera.com/npl?user=".PINGUSERNAME."&pass=".PINGPASSWORD."&apiver=2.3&msisdn=".$r['r1']);
$data = split("'n",$response);
if ($data[0]=="QUERYOK")
{
list($number,$network, $msg)=split(" ",$data[1]);
if($msg ==''){$msg='OK';}
$sql = mysql_query("SELECT network FROM ".PREFIX."networks WHERE code='".$network."'");
$row = mysql_fetch_object($sql);
mysql_query("UPDATE ".PREFIX."pings SET response='$msg', network='$row->network', dateUpdated='$dateandtime' WHERE r1='".$r['r1']."' ");
//echo "Carrier for $number is $r->network";
}
else
{
mysql_query("UPDATE ".PREFIX."pings SET response='".$data[0]."', dateUpdated='$dateandtime' WHERE r1='".$r['r1']."' ");
}
}
mysql_query("UPDATE ".PREFIX."pings_holder SET pinged='Yes' WHERE holderID ='$id' ");
$_SESSION['success'] = 'Records Pinged '.$error;
header('Location: '.DIR);
exit();
?>
最好将这样的脚本作为一个单独的进程来执行,客户机只初始化该进程。如果客户端不等待就关闭浏览器怎么办?似乎你的脚本只更新数据库条目和报告它已经完成,所以没有API调用结果发送到客户端,你可以触发你的处理脚本
exec("php pingRecords.php > /dev/null &");
并向客户端报告已启动。
您最好还使用curl_multi函数并行化API调用。Curl似乎也有更好的性能,参见"file_get_contents VS Curl,哪个性能更好?"
您最好通过命令行运行脚本,这对于处理大量数据的脚本通常更好。
您需要确保您的FTP用户具有shell访问权限,然后使用Putty之类的工具在服务器上执行php脚本。