我下面有一个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 :(得分:0)
上周我遇到了完全相同的问题,即使我在具有完全root访问权限的VPS服务器上,我也不想弄乱etc/
文件夹中的文件或{{ 1}}或任何其他PHP设置...
所以我提出了自己的解决方案..
请注意此解决方案和此答案旨在让您和其他人了解如何在不摆弄服务器设置的情况下解决此问题...
实际上解决方案很简单......
首先,我在MYSQL数据库中创建了一个额外的列,其预定义值为0.您可以将其命名为任何名称。
我接下来做的基本上是php.ini
我的LIMIT
到100。
类似的东西:
SELECT
然后我用这100个选定项目做了我想做的任何事情,每次我做了SELECT * FROM mytable WHERE newColumn=0 LIMIT 100
数据库并更改了UPDATE
我重复了同样的过程,直到MYSQL数据库中没有newColumn=1
的数据。
一旦我到达这个阶段,我再次更新表格并将newColumn重置为0。
请注意,我在newColumn=0
上运行上述过程。
这样你的PHP就不会被杀死,因为你只从MYSQL中选择了100行。
希望这会有所帮助。