有没有更好的方法来处理这个PHP脚本? - 超时问题

时间:2012-01-18 02:24:31

标签: php sql timeout

我整理了一个简单的脚本,从两个表中提取产品名称,类别名称和产品ID。然后我将这些数据用于创建一个比我目前用于搜索引擎优化目的更好的页面标题。出于某种原因,我认为只要它运行起来就会花费很长时间。有7k产品。

我的托管公司允许创建自定义php.ini,因此我能够覆盖30秒的时间限制并将其更改为6000.但是脚本仍然会超时。所以我认为我的剧本很糟糕。 :)

以下是脚本。有没有更好的方式我可以写这个,所以它没有超时?或者我正在尝试做什么只是花一些时间,我需要编写脚本一次做一个类别?

<?php
// Make a MySQL Connection
mysql_connect("localhost", "myusername", "mypassword") or die(mysql_error());
mysql_select_db("mydatabase") or die(mysql_error());

$result = mysql_query("SELECT isc_products.prodcode, isc_products.prodname, isc_categories.catname FROM isc_products, isc_categories WHERE isc_products.prodcatids = isc_categories.categoryid") 
or die(mysql_error());


while($row = mysql_fetch_array($result)){
$pname = mysql_real_escape_string($row['prodname']);
$catname = mysql_real_escape_string($row['catname']);
$sitename = Sitename;
$prodcode = $row['prodcode'];
$result2 = mysql_query("UPDATE isc_products SET prodpagetitle = '$pname - $catname - $sitename' WHERE prodcode = '$prodcode'") 
or die(mysql_error());
}

?>

indexes http://www.threewestcreative.com/indexes.jpg

谢谢,感谢您的帮助。 :)

非常感谢大家!我非常感谢快速反应。我无法相信我忽略了对数据库运行直接查询这么简单的事情(没有php)。吉兹......再次感谢!

4 个答案:

答案 0 :(得分:2)

跑步

UPDATE isc_products
INNER JOIN isc_categories ON isc_products.prodcatids = isc_categories.categoryid
SET isc_products.prodpagetitle=CONCAT(isc_products.prodname,' - ',isc_categories.catname,' - $sitename');

如果它超时,你的数据库很可疑(缺少指数?)

答案 1 :(得分:1)

您可以使用一个查询来执行您想要的操作。

UPDATE ssc_products, isc_categories 
SET psc_products.prodpagetitle = CONCAT_WS(' - ',  isc_products.prodname, isc_categories.catname, $sitename)
WHERE isc_products.prodcatids = isc_categories.categoryid;

答案 2 :(得分:0)

你能展示你的桌子结构吗?在处理那么多产品时,索引是关键。此外(while)循环在这里很糟糕,它会影响性能。就像上面提到的那些家伙一样,查询应该可以解决问题。

答案 3 :(得分:0)

我不确定为什么你在PHP中这样做,因为你可以用一个UPDATE实现这一点。也许你已经遗漏了一些事情,比如确定哪些记录已经被改变了?

所以我假设您确实希望在PHP中执行此操作,并且您只想运行此脚本一次,以便在表格范围内更新prodpagetitle字段。

一种选择是将其拆分为单独的脚本。有一个执行SELECT的主脚本,然后通过调用第二个脚本跳过UPDATE,其中数据用于GET中的变量。例如:

<?php
// Make a MySQL Connection
mysql_connect("localhost", "myusername", "mypassword") or die(mysql_error());
mysql_select_db("mydatabase") or die(mysql_error());

$result = mysql_query("SELECT isc_products.prodcode, isc_products.prodname, isc_categories.catname FROM isc_products, isc_categories WHERE isc_products.prodcatids = isc_categories.categoryid") 
or die(mysql_error());

while ($row = mysql_fetch_array($result)) {
  $pname = mysql_real_escape_string($row['prodname']);
  $catname = mysql_real_escape_string($row['catname']);
  $sitename = Sitename;
  $title=sprintf("%s - %s - %s", $pname, $catname, $sitename);
  $url=sprintf("http://example.com/update.php?pcode=%s&title=%s", $row['prodcode'], $title);
  $junk=file_get_contents($url)
}

?>

<?php

// This is update.php, called by the script above.
mysql_connect("localhost", "myusername", "mypassword") or die(mysql_error());
mysql_select_db("mydatabase") or die(mysql_error());

$qfmt="UPDATE isc_products SET prodpagetitle = '%s' WHERE prodcode='%s'";
mysql_query(sprintf($qfmt, $_GET['pcode'], urldecode($_GET['title']));

?>

节点认为这应该被视为示例代码。我没有测试它,也没有计划。您可能希望包含一些工具来标记已经更改的字段,这样如果新脚本也超时(可能会出现),您可以继续从中断。此脚本包含漏洞,只应在安全环境中运行或进行重大修改才能使其安全。 &LT; /&的FinePrint GT;