Консультация № 159193
30.01.2009, 15:20
30.00 руб.
0 22 0
Здравствуйте, уважаемые эксперты!
Не получается сделать цикл для проверки нескольких номеров скриптом. Мне нужно, чтобы с каждым числом, последовательность которых я пробовал задавать разными способоми, происходило несколько одинаковых действий, а результат записывался в файл или БД. Все получилось, кроме цикла. Число берется в переменную, производятся действия, правда, записывается результат уже другой переменной. Для одной операции все работает. Неохота менять числа вручную, много действий получается. Если будет нужен код, сообщу дополнительно.
Заранее благодарен.
Козлов Олег Эдуардович.

Обсуждение

Неизвестный
30.01.2009, 15:37
общий
последовательность которых я пробовал задавать разными способоми

например как ?
Неизвестный
30.01.2009, 15:52
общий
$number = 1;
while ( $number <= 5)
{
//Здесь необходимые мне действия
// Результат в виде переменной $totalvalue записываем в файл
$number ++;
}
echo 'Проверка окончена';
// Пробовал для for и тому подобные, логика одинакова. Результат одинаков, вывод только для первого числа.
Неизвестный
30.01.2009, 15:57
общий
в каком месте и как открывается файл?
Неизвестный
30.01.2009, 16:10
общий
Пробовал и с локального компьютера. У меня все нужное программное обеспечение установлено, а также со своего сайта. Результат одинаков. Открываю простым вводом в адресную строку, хотя пробовал и через форму, там естественно приходится передавать данные в переменные (начальное и максимальное значения). Этот скрипт ничего больше не делает, теги <?php и ?> сразу до и после тела скрипта.
Неизвестный
30.01.2009, 16:17
общий
// Результат в виде переменной $totalvalue записываем в файл

Я имел в виду этот файл. Его содержимое Вас в конце интересует. Или нет?
Неизвестный
30.01.2009, 16:30
общий
Да, его значение. Но его значение для каждого значения $number разное. И все они записываются в файл построчно. Текстовый файл открывается обычно, если на своем компе или через специальный файловый менеджер на сайте. Если Вы имеете в виду код открытия, то вот он:
// записываем в файл
@ $fp = fopen("$DOCUMENT_ROOT/../test.txt", 'ab');
fwrite($fp, $totalvalue);
fclose($fp);
Неизвестный
30.01.2009, 17:03
общий
тоесть
$number = 1;
while ( $number <= 5)
{

//Здесь необходимые мне действия

@ $fp = fopen("$DOCUMENT_ROOT/../test.txt", 'ab');
fwrite($fp, $totalvalue);
fclose($fp);
$number ++;
}
echo 'Проверка окончена';

оставляет в test.txt только первый результат? странно… он действительно должен записать туда только одну строчку, но со всеми результатами подряд (чтобы каждый результат писался отдельно исправте в коде: fwrite($fp, $totalvalue."\n"); ). А при проделывании "необходимых действий" $number, случайно, не изменяется???
Неизвестный
30.01.2009, 17:41
общий
$number не изменяется. Он используется так: в переменную $title=$f. $number. Больше не используется. Дальше действия с переменной $title. Результаты $title в случае получения положительного результата или отрицательного передаются в переменную $totalvalue. При передаче данных из переменной $title и применяется перенос. У меня был вариант записи нескольких значений, но они были неправильные, хоть и построчно. Неправильные в смысле, результат отрицательный, хотя он точно должен быть положительный.
Неизвестный
30.01.2009, 17:47
общий
Если возможно: покажите весь код, а то совсем ничего не понятно
Неизвестный
30.01.2009, 17:57
общий
Придется тогда коснуться моральной стороны скрипта. Этот скрипт для парсинга. Но криминального здесь ничего нет. У меня есть партнеры из Китая, мне нужно проверять наличие товара не ихнем сайте. Они честные люди, но немного небрежные. У них нет прайс-листа, они меня не уведомляют о том, что товар закончился или появился новый. Мне они предлагают: просто проверяйте наш сайт. Я хочу автоматизировать проверку. Если вы согласны продолжать разбирать код, дайте согласие. Естественно, название сайта я изменю на "xxx". Переменные тоже другие, просто ошибся, когда задал здесь вопрос.
Неизвестный
30.01.2009, 18:08
общий
Для парсинга, так для парсинга… Не вижу криминала. Если люди выложили что-то в интернете и это можно прочитать, то почему его нельзя обработать по своему усмотрению???
Давайте скрипт.
Неизвестный
30.01.2009, 18:14
общий
<?php
//создание цикла проверки ссылок
$number = 837;
while ($number <= 839 )
{
$f = "http://www.xxx.com/index.php?main_page=product_info&cPath=54_98&products_id=";
$totalvalue=$f. $number;
// инициализация сеанса
$ch = curl_init();
// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, $totalvalue);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$text=(curl_exec($ch));
//извлекаем заголовок
$eror = ('- empty');
$truth = ("$number". ' - ');
if (preg_match('|<h1 id="productName" class="productGeneral">(.*)</h1>|sei', $text, $arr))
$title = "$truth". "$arr[1]". "\n";
else
$title = "$number $eror\n";
// записываем в файл
@ $fp = fopen("DOCUMENT_ROOT/../fetch.txt", 'ab');
fwrite($fp, $title. "\n");
fclose($fp);
// завершение сеанса и освобождение ресурсов
curl_close($ch);
$number++;
}
echo 'Обновление закончено.';
?>
Неизвестный
30.01.2009, 18:36
общий
1)надеюсь всё-таки
@ $fp = fopen("$DOCUMENT_ROOT/../fetch.txt", 'ab');



2)есть ОГРОМНЕЙШЕЕ желание не дергать файл и немного по-debug'гить запись:

<?php
@$fp = fopen($DOCUMENT_ROOT."/../fetch.txt", 'a');
$f = "http://www.xxx.com/index.php?main_page=product_info&cPath=54_98&products_id=";
//создание цикла проверки ссылок
$number = 837;
while ($number <= 839 )
{
$totalvalue=$f.$number;
// инициализация сеанса
…………………………………………
// записываем в файл
fwrite($fp, $number.' ');
fwrite($fp, $title); //если title и так содержит \n , то здесь он вряд ли нужен. А number - просто для отладки. Он-то должен записатся в любом случае…
// завершение сеанса и освобождение ресурсов
curl_close($ch);
$number++;
}
echo 'Обновление закончено.';
fclose($fp);
?>
Неизвестный
30.01.2009, 19:41
общий
1. Как ни странно, но когда ставлю символ $ в DOCUMENT_ROOT. Ничего не записывается. Без него пишет в файл.
2. Если есть эти 2 строчки:
fwrite($fp, $number.' ');
fwrite($fp, $title);
То записывается номер ($number) два раза.
Я убираю первую строчку, пишет 1 раз.
3. Все равно записывается только первое значение.
Вот весь полученный код:
<?php
@$fp = fopen("DOCUMENT_ROOT/../fetch.txt", 'a');
$f = "http://www.xxx.com/index.php?main_page=product_info&cPath=54_98&products_id=";
//создание цикла проверки ссылок
$number = 837;
while ($number <= 839 )
{
$totalvalue=$f.$number;
// инициализация сеанса
$ch = curl_init();
// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, $totalvalue);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$text=(curl_exec($ch));
//извлекаем заголовок
$eror = ('- empty');
$truth = ("$number". ' - ');
if (preg_match('|<h1 id="productName" class="productGeneral">(.*)</h1>|sei', $text, $arr))
$title = "$truth". "$arr[1]". "\n";
//$title = "$arr[1]". "\n";
else
$title = "$number $eror\n";
// записываем в файл
fwrite($fp, $title);
//если title и так содержит \n , то здесь он вряд ли нужен. А number - просто для отладки. Он-то должен записатся в любом случае…
// завершение сеанса и освобождение ресурсов
curl_close($ch);
$number++;
}
echo 'Обновление закончено.';
fclose($fp);
?>
Неизвестный
31.01.2009, 16:08
общий
в упор не вижу где глюк

предлагаю следюющий алгоритм:
1)выбросить всё (закомментировать), кроме цикла и записи значения $number в файл
2)добавить работу с curl, но регулярные выражения и вычисление $title оставить в комментариях
3)вернуть полную функциональность

расчитываю на то, что выполнение скрипта обрывается вследствие какой-то ошибки либо в коце первого цикла, либо в начале второго
(если честно - грешу на curl, т.к. мало с ним работал - всегда хватало того, что URL можно открыть файловыми функциями)
Неизвестный
01.02.2009, 17:08
общий
Да, похоже проблема в использовании curl. Цикл перестает работать при добавлении 2 действия по вашему алгоритму. Видимо неправильно использую curl, или вообще надо искать какой-то обходной путь.
Неизвестный
02.02.2009, 10:18
общий
попробуйте curl_init и curl_close тоже вынести за рамки цикла. Если не поможет - попробуйте заменить его использование на конструкцию
$text=implode(file($totalvalue),' ');
но оно будет работать только если на сервере включена в php.ini опция allow_url_fopen (как я понимаю сервер Ваш и с её установкой проблемм не будет).
Неизвестный
02.02.2009, 17:38
общий
Вынес curl_init и curl_close за рамки цикла. Ничего не изменилось. Опция allow_url_fopen включена (on). Не совсем понял вашу рекомендацию. Вместо использования curl использовать $text=implode(file($totalvalue),' ');? Как тогда взять данные с удаленного сайта?
Неизвестный
02.02.2009, 19:22
общий
Всё просто: файловые функции открывают URL'ы.
Функция file возвращает массив строк - содержание файла(тоесть в данном случае - HTML-код страницы). implode - "клеит" элементы массива с разделителем один пробел. Если у Вас это разрешено(а отно у Вас разрешено!), то такая конструкция просто заменит всю Вашу работу с curl.
Неизвестный
04.02.2009, 14:46
общий
Получилось то же самое. Результат с первым значением. Странная проблема.
Неизвестный
22.02.2009, 17:18
общий
Проблема оказалась во времени выполнения скрипта, ограниченного настройками php.ini. Изменил с 30 секунд до 120, корректно выполнилось для 4 страниц.
Неизвестный
23.02.2009, 10:32
общий
Да… о таком "счастье" я не подумал…
Форма ответа