У меня ниже 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());
}
?>
Спасибо за ваше время, и я ценю любую помощь.
У меня была точно такая же проблема на прошлой неделе, и хотя я нахожусь на 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.
надеюсь это поможет.
Других решений пока нет …