Php 处理大型远程文件时出现超时问题

Php 处理大型远程文件时出现超时问题,php,file-get-contents,Php,File Get Contents,我的脚本有问题,我需要从远程API收集信息。我的脚本在只处理几行数据(比如200行)时工作正常,但当我尝试运行更大的数据集时,当我查看日志时,页面最终显示一条超时消息。它说的唯一有用的东西是错误代码500 我已经尝试增加内存限制、执行时间和输入时间,看看这是否能解决问题,但到目前为止还没有。我已经在下面发布了我的脚本。如果有人能看到我做错了什么,或者有一种远程处理大文件的方法,我将不胜感激 <?php set_time_limit (0); ini_set('memory_limit',

我的脚本有问题,我需要从远程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();
    ?>

最好通过命令行运行脚本,这通常更适合于处理大量数据的脚本


您需要确保您的FTP用户具有shell访问权限,然后使用类似的方法在服务器上执行php脚本。

最好将此类脚本作为单独的进程执行,客户端只启动该进程。如果客户端不等待就关闭浏览器,该怎么办? 看起来您的脚本只更新数据库条目并报告它已经完成,所以并没有API调用结果发送到客户端,您可以触发您的处理脚本

exec("php pingRecords.php > /dev/null &");
并向客户报告它已启动


您最好使用curl\u多函数来并行化API调用。Curl似乎也有更好的性能,请参见“”

增加最大执行时间后会发生什么?一个500错误应该总是伴随着一个详细的错误消息出现在日志中。如果错误日志[26/Oct/2011:11:29:30+0000]“GET/pingcenter/includes/ping.PHP?pr=12 HTTP/1.1“500 100”“”Mozilla/4.0,那么当PHP在安全模式下运行时,
设置时间限制将无效(兼容;MSIE 8.0;Windows NT 6.1;Trident/4.0;GTB7.1;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;Media Center PC 6.0;.NET4.0C)”我确定服务器没有在安全模式下运行。你确定这是错误日志吗?在我看来,这更像是访问日志。错误日志应该包含一条实际的错误消息,解释发生的情况。如果是访问日志我的错误,错误日志中只包含与其他事情相关的错误。理想情况下,我希望这样做,但我的客户nee除外ds能够启动这个过程,所以我把一个Ui放在一起,除了读取大数据之外,所有的东西都可以工作,我想如果我把读取分块,那可能是更好的方法。啊,好吧。也许分块是最好的方法。或者你设置一个cron作业,每5分钟运行一次,或者什么的,检查客户端是否当运行脚本时(例如,数据库中的一个标志?),如果它已经运行了进程,如果它什么也没有做。结束时,执行路径工作得非常完美。这样,我会提醒客户端进程已经启动,当进程结束时,也会释放浏览器。