2012-01-18 140 views
1

我整理了一个简单的脚本,从两个表中抽取产品名称,类别名称和产品ID。然后我拿这些数据,并用它来创建一个比我目前用于搜索引擎优化目标更好的页面标题。出于某种原因,我认为只要需要运行,就会花费很长时间。有7K款产品。有没有更好的方法来处理这个PHP脚本? - 超时问题

我的托管公司确实允许创建一个自定义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)。 Geez ......再次感谢!

+0

由于您正在选择如此多的行,请尝试使用类似Navicat的方式直接运行查询(而不是通过php)来检测数据库是否是瓶颈。 – F21 2012-01-18 02:28:20

+0

首先你在数据库上使用索引?这完全不同。 – Frankie 2012-01-18 02:28:43

+0

你不需要从mysql获得mysql_real_escape_string数据。另外我没有看到你的sitename常量?你也不需要这样做,你可以从选定的行更新MySQL数据,甚至不使用PHP http://www.electrictoolbox.com/article/mysql/cross-table-update/ – Steven 2012-01-18 02:30:48

回答

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'); 

如果超时,你的数据库是腥(失踪指数?)

+0

因此,如果我在PhpMySQL中运行这个说法,会影响表中的所有项目记录吗?我明白你的意思。我想我陷入了一种模式(做php脚本),因为我对此很新颖。 – Tsanders 2012-01-18 03:14:04

+0

UPDATE在满足WHERE子句的所有行上运行 - 因为我们没有它,所以UPDATE运行在所有记录上 - 就像SELECT可以给你多行一个查询一样,UPDATE可以用一个查询更新许多行。 – 2012-01-18 03:16:03

+0

我现在明白了。非常感谢!我忽略了在phpmyadmin中运行单个查询的简单行为。 – Tsanders 2012-01-18 03:18:49

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; 
0

你可以显示你的表格结构吗?它在处理那么多产品时很重要,索引是关键。此外(while)循环在这里不好,它会影响性能。就像上面提到的那些人一样,查询应该能够做到。

0

我不知道你为什么在PHP中这样做,因为你可以通过一个更新来实现这一点。也许你遗漏了一些能够识别哪些记录已被更改的事情?

所以我假设你真的想在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'])); 

?> 

节点。我没有测试过,也没有计划。您可能希望包含一些设施来标记已经更改的字段,以便在新脚本超时的情况下(可能会这样),您可以继续停止。此脚本包含漏洞,只能在安全的环境中运行或进行重大修改才能使其安全。 </fineprint>

相关问题