Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Одновременное выполнение нескольких скриптов
 
 автор: RajaxteN   (14.04.2007 в 14:05)   письмо автору
 
 

У меня есть цикл IF, который выполняет один и тотже скрипт 200 раз. На каждое выполнение уходит не менее 1 секунды. Возможно ли сделать так, чтобы выполнялось сразу 200 операций за 1 секунду, ну или чуть больше ?
Я пробовал использовать include:

<?php
include ("");
?>

Но разницы никакой, к тому же тяжело создать 200 файлов вместо 1 цикла.
Можно ли в PHP сделать одновременное выполнение некоторых операций ?

   
 
 автор: Poison   (14.04.2007 в 14:08)   письмо автору
 
   для: RajaxteN   (14.04.2007 в 14:05)
 

Кстати меня тоже этот вопрос интересует=) Но помойму нельзя:(

   
 
 автор: RajaxteN   (14.04.2007 в 14:11)   письмо автору
 
   для: Poison   (14.04.2007 в 14:08)
 

А если нельзя, то хотя бы заставить php через что-нибудь другое ... ?

   
 
 автор: CrazyAngel   (14.04.2007 в 15:41)   письмо автору
 
   для: RajaxteN   (14.04.2007 в 14:05)
 

у php нет многопотоковости, как мне известно;
include(""); - просто вставляет код в скрипт, так что это не то.

можно попробовать использовать много фреймов на странице...

   
 
 автор: RajaxteN   (14.04.2007 в 16:13)   письмо автору
 
   для: CrazyAngel   (14.04.2007 в 15:41)
 

Можно, но вряд ли это получиться когда используешь циклы, к тому же тяжеловато сделать более 200 фреймов... хотя если постараться, то можно и так. Надо бы сделать все на одном фрейме...

   
 
 автор: RajaxteN   (14.04.2007 в 19:14)   письмо автору
 
   для: RajaxteN   (14.04.2007 в 16:13)
 

Может кто все-таки знает ?

   
 
 автор: Киналь   (14.04.2007 в 20:23)   письмо автору
 
   для: RajaxteN   (14.04.2007 в 16:13)
 

>Можно, но вряд ли это получиться когда используешь циклы, к тому же тяжеловато сделать более 200 фреймов... хотя если постараться, то можно и так. Надо бы сделать все на одном фрейме...

Ну, чисто теоретически можно сделать вспомогательный скрипт, который будет в цикле создавать фреймы=)

   
 
 автор: Shorr Kan   (14.04.2007 в 20:28)   письмо автору
 
   для: Киналь   (14.04.2007 в 20:23)
 

exec, фоновое выполнение, символ амперсанда в конце... плюс перенаправление вывода в /dev/null ...
Всё это прекрасно работает.


цикл начался

exec("/path/to/php -f /path/to/script.php > /dev/null &");

цикл закончился


Вместо exec можно использовать любого его собрата.
Не убейте сервер.

   
 
 автор: RajaxteN   (14.04.2007 в 20:47)   письмо автору
 
   для: Shorr Kan   (14.04.2007 в 20:28)
 

Касперский просто взбесился : )))

обнаружено: потенциально опасное ПО RootShell

Надо почитать описание семейства exec - может разберусь )

   
 
 автор: RajaxteN   (14.04.2007 в 21:15)   письмо автору
 
   для: RajaxteN   (14.04.2007 в 20:47)
 

Попробовал я через запихнуть в каждый фрейм по скрипту. Создал главный файл, который все зацикливает. Ответ: при использовании фреймов выполнение все равно остается последовательным (ну по крайней мере у меня так).
Остается exec и его друзья, есле нет других вариантов.)

   
 
 автор: RajaxteN   (15.04.2007 в 12:12)   письмо автору
 
   для: RajaxteN   (14.04.2007 в 21:15)
 

Exec никак не пускает касперский, да и не хочется с ним связываться.
Нашел я в инете, что многопоточность можно сделать с помощью fork(), либо Perl.
Но вот только реализовать fork или Perl у меня не получается - если кто может написать скрипт многопоточности для цикла, то буду очень благодарен :_)

   
 
 автор: KPETuH   (16.04.2007 в 08:59)   письмо автору
 
   для: RajaxteN   (15.04.2007 в 12:12)
 

а что вообще скрипт ваш делает?...

   
 
 автор: RajaxteN   (16.04.2007 в 11:53)   письмо автору
 
   для: KPETuH   (16.04.2007 в 08:59)
 

Ну, к примеру мне надо сделать поиск по базе данных, в которой 10 000 ячеек.
Естественно тратится много времени на поочередное их обрабатывание.
Лучший выход - создание многопоточности, т. е. одновременное обрабатывание этих ячеек.

   
 
 автор: CrazyAngel   (16.04.2007 в 11:59)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 11:53)
 

эм... помоему это проблема не php... с помощью него тут не помочь.

   
 
 автор: KPETuH   (16.04.2007 в 12:03)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 11:53)
 

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

   
 
 автор: Loki   (16.04.2007 в 12:07)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 11:53)
 

и что будет в итоге? 1000 результатов поиска?

   
 
 автор: Shorr Kan   (16.04.2007 в 12:35)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 11:53)
 

Реализуемо. Только объясните - причем здесь касперский? Вы не хотите делать это на сервере?

   
 
 автор: RajaxteN   (16.04.2007 в 12:49)   письмо автору
 
   для: Shorr Kan   (16.04.2007 в 12:35)
 

1. Это нужно делать на сервере.
2. Мне предложили использовать exec("/path/to/php -f /path/to/script.php > /dev/null &"); , запускаю скрипт... вот только антивирус не может успокоиться, пока не удалит apache.
3. Решение я вижу в использовании сокетов в perl, причем с разделением на потоки, а не на процессы, но вот только написать сам скрипт для цикла в php не могу.
Вот и сижу сейчас - почти установил perl :)
А может и без perl можно обойтись ?

   
 
 автор: KPETuH   (16.04.2007 в 12:59)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 12:49)
 

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

   
 
 автор: RajaxteN   (16.04.2007 в 13:08)   письмо автору
 
   для: KPETuH   (16.04.2007 в 12:59)
 

Так в php есть сокеты ? Или нужно установить какое-то расширение ?

   
 
 автор: KPETuH   (16.04.2007 в 13:14)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 13:08)
 

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

   
 
 автор: RajaxteN   (16.04.2007 в 13:19)   письмо автору
 
   для: KPETuH   (16.04.2007 в 13:14)
 

Все будет в порядке - я буду разбивать потоки на порции до 50 запросов одновременно, ну или поменьше.
Главное - написать сам скрипт, что у меня вряд ли получится. Для начала скажите - что нужно для поддержки сокетов ?_)

   
 
 автор: KPETuH   (16.04.2007 в 13:27)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 13:19)
 

нужно чтоб хостер поддерживал сокеты...

   
 
 автор: RajaxteN   (16.04.2007 в 13:30)   письмо автору
 
   для: KPETuH   (16.04.2007 в 13:27)
 

Я сначала хотел бы сделать это на своем компьютере - у меня установлен Apache 2 + PHP 5.
И как сделать поддержку сокетов *?

   
 
 автор: KPETuH   (16.04.2007 в 13:29)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 13:19)
 

меня заблочили за 60 запросов за 5 сек :)

   
 
 автор: RajaxteN   (16.04.2007 в 13:32)   письмо автору
 
   для: KPETuH   (16.04.2007 в 13:29)
 

Я это учту - сначала все сделаю на локальном компьютере.

   
 
 автор: Shorr Kan   (16.04.2007 в 13:41)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 12:49)
 

Если это нужно сделать на сервере - то зачем вы слушаете касперского? Или он и на сервере установлен? Какая OS ?

/path/to/php - вы его правильно написали? Путь к php указали верный? А к скрипту?

Использовать сокеты можно. Но можно и не использовать. Вариант с exec работоспособен, и выполняет то, что вам нужно - одновременная обработка многих строк. Другой вопрос в балансе нагрузки/скорости, но это подбирается.

   
 
 автор: KPETuH   (16.04.2007 в 13:32)   письмо автору
 
   для: RajaxteN   (14.04.2007 в 14:05)
 

запустите скрипт с phpinfo() и посмотрите настроена ли у вас поддержка сокетов :), скоре всего должна быть..

   
 
 автор: KPETuH   (16.04.2007 в 13:35)   письмо автору
 
   для: KPETuH   (16.04.2007 в 13:32)
 

я когда начал копаться в этом деле использовал для написания вот такой вот пример
http://www.stableversion.com/2006/04/17/multithread-php/

   
 
 автор: RajaxteN   (16.04.2007 в 13:39)   письмо автору
 
   для: KPETuH   (16.04.2007 в 13:35)
 

А я здесь когда-то был )))

Нашел следуещие строки со словом "socket":

1 Registered Stream Socket Transports tcp, udp
2 mysql.default_socket no value no value
3 default_socket_timeout 60 60

Я так понял что в первой строке - работа сокетов с TCP/IP и UDP(вроде это локальный доступ или что-то подобное).

   
 
 автор: RajaxteN   (16.04.2007 в 15:20)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 13:39)
 

2Shorr Kan:
возможно я действительно ошибся в написании )
можете написать скрипт с приблизительным путем к php как он должен быть для Windows XP на C:/php5/

   
 
 автор: RajaxteN   (16.04.2007 в 15:20)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 13:39)
 

И еще - как именно указывать путь к скрипту, и если exec расположен в самом скрипте, то путь к нему же ? exec("/path/to/php -f /path/to/script.php > /dev/null &"); - одновременно выполняет все строки в файле (тоесть нужно создавать файл с exec и файл с необходимыми операциями)?

   
 
 автор: User   (16.04.2007 в 19:59)   письмо автору
 
   для: RajaxteN   (16.04.2007 в 15:20)
 

А курлом можно так сделать? Если да, то какую опцию добавить?

   
 
 автор: User   (16.04.2007 в 22:02)   письмо автору
 
   для: User   (16.04.2007 в 19:59)
 

Узнал с помощью гугла, что это можно делать с помощью функций curl_multi_*
Но это относительно новые функции, и на русском очень мало информации. Даже на php.net нет точных описаний. Может, кто нибудь имел дело с этими функциями и даст пример их использования?

   
 
 автор: RajaxteN   (17.04.2007 в 15:11)   письмо автору
 
   для: User   (16.04.2007 в 22:02)
 

Давайте по-порядку:
exec();
exec("/path/to/php -f /path/to/script.php > /dev/null &");
Я спользую её так:
exec ("c:/php5/ -f index.php > /dev/null &");
Антивирус блокирует этот скрипт - кто может объяснить что сделать?
(может не правильное написание, не та OS, не тот антивирус, или это вообще нет то?)...

Неблокируемые сокеты в php - с этим я сталкиваюсь впервые,
хорошей документации не нашел, к тому же не знаю как установить их для php
объясните кто знает...

curl_multi_* - курлы обычные работают, все настроил,
но это я так понимаю только для TCP/IP,
да и не нашел я документации к curl_multi_*
и с ними почему-то не работает curl_setopt,
хотя может это только у меня так получается.
И все же напишите кто в курле пашет, про curl_multi_* |_)

Если вы знаете другие способы многопоточности (fork(); thread(); и т.п.)
то напишите сюда... :)

   
 
 автор: KPETuH   (18.04.2007 в 07:55)   письмо автору
 
   для: RajaxteN   (17.04.2007 в 15:11)
 

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования