Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать чтобы PHP-скрипт не зависал? 
V
    Опции темы
SeregaGREY
Дата 2.4.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 28.7.2006

Репутация: нет
Всего: 0



Имею скрипт, который работает с файлом - вытаскивает из него урлы и затем выполняет функцию с этими урлами:
Код

<? 

$istochniki = File("istochniki.dat");

//Начинаем цикл
for ($p=0;$p<count($istochniki);$p++) {
$dat_arr = explode("|", $istochniki[$p]);

//Содержимое цикла
//Тут идёт функция которая использует урлы из файла $istochniki
//Конец содержимого цикла
}
?>


так вот как видите скрипт сначала берёт данные (урлы) из файла в массив, затем обрабатывает этот массив - так вот эта обработка лится долго, а так как в файле очень много урлов, то время обработки всего массива увеличивается и скрипт например у меня успевает обработать только 8 урлов из файла.
Так вот как сделать так чтобы скрипт без проблем мог обработать все урлы из файла? Слышал что можно использовать AJAX, или нет? Или может ещё что?
PM MAIL   Вверх
bars80080
Дата 2.4.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(SeregaGREY @  2.4.2010,  11:05 Найти цитируемый пост)
а так как в файле очень много урлов

и каков размер файла?
PM MAIL WWW   Вверх
Wolf1994
Дата 2.4.2010, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: 7
Всего: 29



Функция file () работает с удалённым файлом или локальным?
PM MAIL WWW   Вверх
SeregaGREY
Дата 2.4.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 28.7.2006

Репутация: нет
Всего: 0



c локальным. размер меньше мегабайта. но суть не в долгом считывании файла а в том что функция выполняющая операции с данными из файла длится очень долго, то есть она выполняет операцию с первой строкой, затем со второй, затем с третьей. нужно как то после обработки каждой строки что-то сделть чтобы скрипт как бы начинал действовать заново а не обрабатывал все строки за раз и зависал
PM MAIL   Вверх
bars80080
Дата 2.4.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



значит все проблемы в этой функции. можете дать код? мягко говоря, 8 строк даже за самый малый лимит в 30 секунд - это чересчур.
здесь уместилось бы несколько десятков тысяч операций со строками.

может быть у вас там открытие урлов и их чтение, а не просто обработка?
в таком случае надо каждому урлу в соответствие прописывать флаг - обработан он или нет и записывать в тот же файл
с базой данных в этом случае всё гораздо проще
PM MAIL WWW   Вверх
SeregaGREY
Дата 2.4.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 28.7.2006

Репутация: нет
Всего: 0



Цитата(bars80080 @ 2.4.2010,  15:53)
значит все проблемы в этой функции. можете дать код? мягко говоря, 8 строк даже за самый малый лимит в 30 секунд - это чересчур.
здесь уместилось бы несколько десятков тысяч операций со строками.

может быть у вас там открытие урлов и их чтение, а не просто обработка?
в таком случае надо каждому урлу в соответствие прописывать флаг - обработан он или нет и записывать в тот же файл
с базой данных в этом случае всё гораздо проще

да, у меня там по каждому урлу идёт POST-запрос на него.

а зачем делать флаг обработан или нет?
PM MAIL   Вверх
bars80080
Дата 2.4.2010, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(SeregaGREY @  2.4.2010,  17:30 Найти цитируемый пост)
а зачем делать флаг обработан или нет?

чтобы на следующем заходе начать с необработанных урлов. в базе прсто, вводится дополнительное поле, и туда записывается 1, если урл обработан. здесь же придётся мучаться с записью, и разборкой
PM MAIL WWW   Вверх
SeregaGREY
Дата 2.4.2010, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 28.7.2006

Репутация: нет
Всего: 0



Цитата(bars80080 @ 2.4.2010,  20:46)
Цитата(SeregaGREY @  2.4.2010,  17:30 Найти цитируемый пост)
а зачем делать флаг обработан или нет?

чтобы на следующем заходе начать с необработанных урлов. в базе прсто, вводится дополнительное поле, и туда записывается 1, если урл обработан. здесь же придётся мучаться с записью, и разборкой

всё равно не пойму зачем. ну запишем мы. а потом всё равно нужно же остальные обрабатывать. или вы предлагаете записать и остановить скрипт с выводом кнопки далее, у которой будет функция старта скрипта с урла с флагом? и так каждый раз эту кнопку нажимать?
PM MAIL   Вверх
bars80080
Дата 2.4.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(SeregaGREY @  2.4.2010,  21:00 Найти цитируемый пост)
или вы предлагаете записать и остановить скрипт с выводом кнопки далее, у которой будет функция старта скрипта с урла с флагом? и так каждый раз эту кнопку нажимать? 

а ты ничего не говорил о методе запуска. я имел ввиду автоматизированную систему. закинул пачку адресов, а затем запускаешь некий исполнительный скрипт. он выбирает урл, отрабатывает с ним, записывает флаг - сделал. берёт следующий. в какой-то момент скрипт перестаёт работать. в следующий раз когда запускается исполнительный скрипт, он уже не смотри на отмеченные урлы, а берёт следующий.

что касается его последующего запуска, то это зависит исключительно от вкусов. можно повесить исполнение на заход пользователя, можно на планировщик задач, можно вообще хитрую схему, мол, при запуске исполнителя, если есть не отмеченные урлы, то записываем в планировщик перезапуск скрипта через минуту.
PM MAIL WWW   Вверх
SeregaGREY
Дата 2.4.2010, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 28.7.2006

Репутация: нет
Всего: 0



Цитата(bars80080 @ 2.4.2010,  21:19)
Цитата(SeregaGREY @  2.4.2010,  21:00 Найти цитируемый пост)
или вы предлагаете записать и остановить скрипт с выводом кнопки далее, у которой будет функция старта скрипта с урла с флагом? и так каждый раз эту кнопку нажимать? 

а ты ничего не говорил о методе запуска. я имел ввиду автоматизированную систему. закинул пачку адресов, а затем запускаешь некий исполнительный скрипт. он выбирает урл, отрабатывает с ним, записывает флаг - сделал. берёт следующий. в какой-то момент скрипт перестаёт работать. в следующий раз когда запускается исполнительный скрипт, он уже не смотри на отмеченные урлы, а берёт следующий.

что касается его последующего запуска, то это зависит исключительно от вкусов. можно повесить исполнение на заход пользователя, можно на планировщик задач, можно вообще хитрую схему, мол, при запуске исполнителя, если есть не отмеченные урлы, то записываем в планировщик перезапуск скрипта через минуту.

но тут нужно кроны настраивать, а я просто хочу запустить скрипт и чтобы он сразу мне обработал файл. знаю что на AJAX можно как-то так сделать:
Код

http://dddd.... OK
http://gdfgfd.... OK
http://sdgdsg.... OK
и т.д.

то есть оно не будет зависать а будет построчно читать и выводить на экран что прочло и обработало, завершать с одной строкой, останавливаться и заново запускаться уже со второй строки и т.д. а как это реализовать не знаю(

Это сообщение отредактировал(а) SeregaGREY - 3.4.2010, 00:00
PM MAIL   Вверх
patap
Дата 3.4.2010, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 26
Всего: 40



ну как вариант, можно просто редиректить со скрипта на скрипт, тем самым прерывать работу скрипта

делаем два файла к примеру main.php и temp.php

в main.php будет
Код

  session_start();
  $urls = file('urls.txt');
  
  $_SESSION['count'] = empty($_SESSION['count']) ? 0 : ($_SESSION['count'] + 1);
  
  if ($_SESSION['count'] == count($urls)) {
    unset($_SESSION['count']);
    exit;
  }

  // далее выполняешь свои действия с урлом
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $urls[$_SESSION['count']]);
  //..... и так далее
  
  // после обработки текущего урла, разрывает соединение со скриптом
  header('Location: temp.php');


файл temp.php
Код

  // возвращаемся к нашему главному скрипту
  header('Location: main.php');


Это сообщение отредактировал(а) patap - 3.4.2010, 00:17


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
SeregaGREY
Дата 3.4.2010, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 28.7.2006

Репутация: нет
Всего: 0



z придумал лучше, но не знаю как реализовать. вот смотрите: обрабатываем файл с урлами, вытаскиваем первый арл, обрабатываем его, затем определяем нижестоящий урл и записываем его в сессию и редиректим на другой скрипт. другой скрипт принимает то что записано в сессии и обрабатывает это, потом определяет нижестоящий урл и редиректит на первый скрипт и так до бесконечности.

так вот как сделать то что я выделил? какой функцией определить строку под строкой , которую мы знаем?
ну и соответественно когда строки закончатся как это определить?
PM MAIL   Вверх
SeregaGREY
Дата 4.4.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 28.7.2006

Репутация: нет
Всего: 0



сделал так:
в конце выполнения моей функции, которая обрабатывает урл, я поставил редирект как говорили на другой скрипт с GET['id']+1
и таким образом при каждом редиректе передаётся +1 позиция в GET и скрипты бродят по строчкам вниз и обрабатывают их

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.