我编写了一个简单的脚本,从两个表中提取产品名称、类别名称和产品id。然后我把这些数据用来创建一个比我目前拥有的SEO更好的页面标题。出于某种原因,我认为这不会像跑步那么长时间。有7千种产品。
我的托管公司确实允许创建自定义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());
}
?>
索引http://www.threewestcreative.com/indexes.jpg
谢谢,非常感谢您的帮助
非常感谢大家!我真的很感激你们的快速反应。我不敢相信我忽略了一些简单的事情,比如对数据库运行直接查询(没有php)。天啊。。。再次感谢!
只需运行
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');
如果超时,则您的数据库可疑(缺少索引?)
您只需使用一个查询即可执行所需操作。
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;
您能显示您的表结构吗?在处理这么多产品时,索引很重要。另外(虽然)循环在这里很糟糕,但它会影响性能。就像上面提到的那些家伙一样,1个查询应该可以完成任务。
我不知道你为什么要在PHP中这样做,因为你只需一个UPDATE就可以实现这一点。也许你遗漏了一些功能,比如识别哪些记录已经更改?
因此,我假设您确实想在PHP中执行此操作,并且您只想运行此脚本一次,以便在表范围内更新prodpagetitle字段。
一种选择是将其拆分为单独的脚本。有一个执行SELECT的主脚本,然后通过调用第二个脚本跳过UPDATEs,其中包含要在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']));
?>
节点认为这应该被视为示例代码。我还没有测试过,也不打算测试。你可能想添加一些功能来标记你已经更改的字段,这样,如果新脚本也超时了(可能会超时),你就可以从停止的地方继续。此脚本包含漏洞,只能在安全的环境中运行,或者进行重大修改以确保安全<finebrint>