2011-10-28 26 views
0

私はリモート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(); 
    ?> 
+0

実行時間を最大にするとどうなりますか? 500エラーには、常にログに詳細なエラーメッセージが表示されます。それは何と言いますか? –

+0

PHPがセーフモードで実行されている場合、 'set_time_limit'は有効ではありません.... – xdazz

+0

ここにエラーログ[26/Oct/2011:11:29:30 +0000]の記載があります" GET/pingcenter/includes/ping.php?pr = 12 HTTP/1.1 "500 100" https://www.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) " サーバーがセーフモードで動作していないと確信しています – Dave

答えて

0

このようなスクリプトを別のプロセスとして実行することをお勧めします。クライアントはプロセスを開始するだけです。待機せずにクライアントがブラウザを閉じる場合はどうすればよいですか? それはあなたのスクリプトのみに行うのデータベースエントリとレポートを更新し、そのクライアントに送信されるいかなるAPI呼び出しの結果がないと、あなたは自分の処理スクリプト

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

をトリガし、それをクライアントに開始された報告ができそうです。

また、curl_multi関数を使用してAPI呼び出しを並列化することをお勧めします。 Curlもパフォーマンスが大幅に向上しているようです。「file_get_contents VS CURL, what has better performance?

+0

execルートの終了は、この方法で完全に動作します。クライアントにプロセスが開始したことを警告し、プロセスが終了したら、ブラウザも解放します。 – Dave

0

スクリプトをコマンドラインで実行する方がよいでしょう。これは、多くの場合、多くのデータを処理するスクリプトに適しています。

FTPユーザーにシェルアクセスがあることを確認してから、Puttyのようなものを使用して、サーバー上でPHPスクリプトを実行する必要があります。

+0

理想的には私はそうしたいと思っていますが、私のクライアントがプロセスを開始できるようにする必要があるので、大きなデータを読むことを除いてすべて一緒にUiを組み立てました。多分よりよい方法かもしれないチャンク。 – Dave

+0

ああ。多分それを塊に分解するのが最善の方法です。 5分ごとに実行するようにcronジョブを設定するか、クライアントがスクリプトを実行したかどうかを確認します(データベースのフラグなど)。何もない。 – Nick

関連する問題