2017-09-09 15 views
0

私はcronジョブを使用して毎時実行しているPHPスクリプトを以下に示します。時にはこのスクリプトは何のエラーもなく実行され、504 Gateway Timeoutがスローされます。このPHPスクリプトを実行するとHTTP 504のタイムアウトが発生する

誰かがこのスクリプトの実行と効率を向上させるのに役立つことができますか?私はそれがきれいに書かれることができると信じていますが、どこから始めるべきかわかりません。

これは共有サーバー上にあり、設定の管理はあまりありません。

curl www.mysite.com/apps/script.php 

PHPスクリプト:最大タイムアウトは120

cronジョブであるあなたの時間

<?php 
set_time_limit(500); 
$databasehost = "localhost"; 
$databasename = "foodb"; 
$databasetable = "footable"; 
$databaseusername="foouser"; 
$databasepassword = "foopass"; 
$fieldseparator = ","; 
$lineseparator = "\n"; 
$csvfile = "inventory.csv"; 

if(!file_exists($csvfile)) { 
    die("File not found. Make sure you specified the correct path."); 
} 

try { 
    $pdo = new PDO("mysql:host=$databasehost;dbname=$databasename", 
     $databaseusername, $databasepassword, 
     array(
      PDO::MYSQL_ATTR_LOCAL_INFILE => true, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
     ) 
    ); 

    $sql = "TRUNCATE TABLE $databasetable"; 
    $command = $pdo->prepare($sql); 
    $command->execute(); 

    echo "Removed records from $databasename.\n<br />"; 


} catch (PDOException $e) { 
    die("database connection failed: ".$e->getMessage()); 
} 

$affectedRows = $pdo->exec(" 
    LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable` 
     FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)." 
     LINES TERMINATED BY ".$pdo->quote($lineseparator)."IGNORE 1 LINES"); 

echo "Loaded a total of $affectedRows records from this csv file.\n"; 

/****/ 

try { 
    $pdo = new PDO("mysql:host=$databasehost;dbname=$databasename", 
     $databaseusername, $databasepassword, 
     array(
      PDO::MYSQL_ATTR_LOCAL_INFILE => true, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
     ) 
    ); 

    $sql = $pdo->exec(" 
    UPDATE wp37_pmxi_posts 
    JOIN wp37_postmeta USING (post_id) 
    JOIN inventoryImport ON wp37_pmxi_posts.unique_key = inventoryImport.sku 
    SET meta_value = inventoryImport.qty 
    WHERE meta_key = '_stock'"); 

echo "Updated $affectedRows records after the import.\n"; 


} catch (PDOException $e) { 
    die("database connection failed: ".$e->getMessage()); 
} 

?> 

おかげで、私は任意の助けに感謝します。

+0

あなたは 'sleep()'を使って実行を遅らせようとしましたか? –

+1

cronジョブはどこに実行されていますか?サーバマシンで動作している場合は、 'curl'を使う代わりに' php/path/to/file/script.php'を直接呼び出すことができます。スクリプト上でプログラムを直接呼び出すと、より多くの利益が得られます –

+0

'set_time_limit(500);'を 'set_time_limit(0)'に変更し、あなたのPHPを直接呼び出します。e *** php /path/to/your/script.php*** curlを使う代わりに。 –

答えて

0

私は先週、まったく同じ問題を抱えていましたが、フルルートアクセスのVPSサーバーを使用していましたが、etc/フォルダまたはphp.iniまたは他のPHP設定のファイルを混乱させたくありませんでした。 ..

だから私は、このソリューションとあなたや他の人々には、サーバーの設定をいじることなく、この問題を解決することができる方法のアイデアを与えることを意図し、この答えを注意してください。..私自身の溶液で

を思い付きました。 ..

実際には解決策は非常に簡単でした...

まず、MYSQLデータベースに定義済みの値0を持つ追加の列を作成しました。名前は任意に指定できます。私は次のやった

は次のように基本的にLIMITSELECT

100に何かだった:

SELECT * FROM mytable WHERE newColumn=0 LIMIT 100 

そして私は私がこの100の選択した項目と、私は私UPDATEことをやったたびに望んでいたものは何でもやりましたnewColumn=1

newColumn=0でMYSQLデータベースにデータがなくなるまで、同じプロセスを繰り返しました。

私はこの段階に達すると、私は再びテーブルを更新し、バック私はcron jobに上記のプロセスを実行0

に注意することがnewColumnをリセットします。

このようにして、MYSQLから100行だけを選択しているので、PHPは強制終了されません。

これが役に立ちます。

関連する問題