【问题标题】:Timeout problems processing large remote files处理大型远程文件的超时问题
【发布时间】:2011-10-28 08:22:29
【问题描述】:

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

【问题讨论】:

  • 增加最大执行时间时究竟会发生什么? 500 错误应始终在日志中附带详细的错误消息。它说什么?
  • 当 PHP 在安全模式下运行时 set_time_limit 无效,如果...
  • 这是错误日志中的内容 [26/Oct/2011:11:29:30 +0000] "GET /pingcenter/includes/ping.php?pr=12 HTTP/1.1" 500 100 "theonepoint.org/pingcenter" "Mozilla/4.0(兼容;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)" 我确定服务器没有在安全模式下运行
  • 你确定这是错误日志吗?这对我来说更像是访问日志。错误日志应包含解释发生了什么的实际错误消息
  • 如果访问日志是我的错误,那么错误日志只有与其他事情有关的错误。

标签: php file-get-contents


【解决方案1】:

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

exec("php pingRecords.php > /dev/null &");

并向客户报告它已经启动。

您最好还使用 curl_multi 函数并行化 API 调用。 Curl 似乎也有明显更好的性能,请参阅“file_get_contents VS CURL, what has better performance?

【讨论】:

  • 结束了沿着 exec 路线完美运行,这样我提醒客户端进程已经开始,当进程结束时,也释放浏览器。
【解决方案2】:

你最好通过命令行运行脚本,这对于处理大量数据的脚本来说通常更好。

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

【讨论】:

  • 理想情况下,我想这样做,但我的客户需要能够启动该过程,所以我将一个 Ui 放在一起,除了读取大数据之外,一切正常,我想如果我把阅读分成几块,那可能是一个更好的方法。
  • 啊好吧。也许把它分成几块是最好的方法。要么你设置一个 cron 作业每 5 分钟运行一次,要么检查客户端是否运行了脚本(例如数据库中的标志?),如果它已经运行了进程,如果它没有做任何事情。
猜你喜欢
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
相关资源
最近更新 更多