Тайм-аут HTTP 504 с помощью этого сценария PHP

У меня ниже PHP-скрипт, который я запускаю каждый час, используя cronjob. Иногда этот скрипт выполняется без ошибок, а иногда он выдает 504 Gateway Timeout,

Может ли кто-нибудь помочь улучшить выполнение и эффективность этого скрипта? Я считаю, что это может быть написано чище, но не уверен, с чего начать.

Это на общем сервере, и у меня нет большого контроля над настройками. Максимальное время ожидания составляет 120.

Cronjob:

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

PHP скрипт:

<?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

Решение

У меня была точно такая же проблема на прошлой неделе, и хотя я нахожусь на VPS-сервере с полным доступом root, я не хотел возиться с файлами в etc/ папка или php.ini или любые другие настройки PHP …

Поэтому я придумала собственное решение ..

Обратите внимание, что это решение и этот ответ предназначены для того, чтобы дать вам и другим людям представление о том, как вы можете решить эту проблему, не вмешиваясь в настройки сервера …

Решение было довольно простым на самом деле …

Сначала я создал дополнительный столбец в базе данных MYSQL с предопределенным значением 0. Вы можете назвать его как угодно.

То, что я сделал дальше, было в основном LIMIT мой SELECT до 100.

что-то вроде:

SELECT * FROM mytable WHERE newColumn=0 LIMIT 100

А потом я сделал все, что хотел с этими 100 выбранными предметами, и каждый раз, когда я делал это UPDATE база данных и изменила newColumn=1

И я повторял тот же процесс, пока в базе данных MYSQL больше нет данных с newColumn=0,

как только я достигну этой стадии, я ОБНОВЛЯЮ таблицу снова и сбрасываю newColumn обратно в 0.

Обратите внимание, что я запускаю процесс выше на cron job,

Таким образом, ваш PHP не будет уничтожен, так как вы выбираете только 100 строк в MYSQL.

надеюсь это поможет.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector