Есть ли лучший способ справиться с этим сценарием PHP? - Время ожидания - PullRequest
1 голос
/ 18 января 2012

Я собрал простой скрипт, который извлекает название продукта, название категории и идентификатор продукта из двух таблиц. Затем я беру эти данные и использую их для создания заголовка страницы, который лучше, чем у меня в настоящее время для целей 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). Боже ... Еще раз спасибо!

Ответы [ 4 ]

2 голосов
/ 18 января 2012

Просто беги

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 голос
/ 18 января 2012

Вы можете просто использовать один запрос, чтобы сделать то, что вы хотите.

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 голосов
/ 18 января 2012

Я не уверен, почему вы делаете это на PHP, учитывая, что вы можете достичь этого с помощью одного ОБНОВЛЕНИЯ.Возможно, вы пропустили биты, которые делают такие вещи, как определение того, какие записи уже были изменены?

Итак, я предполагаю, что вы действительно хотите сделать это в PHP, и что вы просто хотите запустить этот скрипт один раз , чтобы обновить поле таблицы prodpagetitle во всей таблице.

Один из вариантов - разделить его на отдельные сценарии.Иметь основной сценарий, который выполняет SELECT, а затем пропускает ОБНОВЛЕНИЯ, вызывая второй сценарий с данными для использования в переменных в 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']));

?>

Узел, который должен рассматриваться как ПРИМЕР кода.Я не проверял это и не планирую.Возможно, вы захотите включить некоторые средства для пометки ваших уже измененных полей, чтобы вы могли продолжить с того места, на котором остановились, если новый сценарий также истечет (что, вероятно, будет).Этот скрипт содержит уязвимости, и его следует запускать только в безопасной среде или со значительными изменениями, чтобы сделать его безопасным.

0 голосов
/ 18 января 2012

Можете ли вы показать структуру ваших таблиц?При работе с таким количеством продуктов важно, чтобы индексация была ключевой.Также (пока) цикл плохой, это повлияет на производительность.Как и парни, упомянутые выше, 1 запрос должен помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...