2013-03-18 2 views
1

У меня есть сценарий php, который я запускаю на моем промежуточном компьютере, который обрабатывает XML-файл в моей базе данных, затем вызывает некоторые процедуры MySQL, которые используются для очистки данных с помощью множества запросов.Процедура вызова PHP MySQL и переход на

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

Есть ли способ, чтобы PHP вызывал эти процедуры, не дожидаясь, когда результат переместится на остальную часть скрипта?

+0

различные подходы возможны. Используете ли вы веб-интерфейс для вызова каждого скрипта php или выполняете его с помощью командной строки? – Sebas

+0

Я вызываю скрипт через веб-интерфейс, поэтому могу ввести некоторые переменные. – EricImprint

+0

Вы пробовали 'объяснять' по этим запросам? Может ли решение быть таким же простым, как добавление некоторых индексов? См.: Https://dev.mysql.com/doc/refman/5.5/ru/explain.html – Greg

ответ

1

PHP не поддерживает параллелизм в ядре. Но вы можете имитировать подобное поведение со следующими методами.

1. fsockopen() и ignore_user_abort ('1')

Вы можете создать сокет-соединение с другим скриптом, который проходит затем в фоновом режиме. См. Следующие два сценария. Основной скрипт создает соединение сокета с суб-скриптом и немедленно закрывает его. Суб-скрипт выполняется до тех пор, пока все задачи не будут завершены. Это происходит из-за ини значение "ignore_user_abort" установлен в 1.

main.php

<?php 
$start = microtime(true); 
$host = 'localhost'; 
$target = '/sub.php'; 
$fp = fsockopen($host, 80); 
$request = "GET $target HTTP/1.1\r\n"; 
$request .= "Host: $host\r\n"; 
$request .= "Connection: Close\r\n\r\n"; 
fwrite($fp, $request); 
fclose($fp); 
file_put_contents("main", "Script runs " . (microtime(true) - $start) . " seconds"); 

sub.php

<?php 
$start = microtime(true); 
ignore_user_abort("1"); 
sleep(5); 
file_put_contents("sub", "Script runs " . (microtime(true) - $start) . " seconds"); 

2. Запустить скрипт над командная строка в фоновом режиме

Вы можете начать сценарий через unix/linu x или Windows в фоновом режиме. Следующий пример приведен для командной строки unix/linux. Чтобы запустить скрипт через командную строку Windows, см. Следующий комментарий на сайте PHP.net. http://www.php.net/manual/en/function.exec.php#110131

main.php

<?php 
$start = microtime(true); 
pclose(popen("/usr/bin/php " . __DIR__ . "/sub.php " . __DIR__ . "//sub.log 2>&1 &", 'r')); 
file_put_contents("main", "Script runs " . (microtime(true) - $start) . " seconds"); 

sub.php

<?php 
$start = microtime(true); 
sleep(5); 
file_put_contents("sub", "Script runs " . (microtime(true) - $start) . " seconds"); 

Следующая расширение предоставляет реальный параллелизм в PHP:

Pthreads является API ориентированного на объект API, который позволяет многопоточность пользовательской земли в PHP. Он включает в себя все инструменты, необходимые для создания многопоточных приложений, ориентированных на Интернет или консоль. Приложения PHP могут создавать, читать, писать, исполнять и синхронизировать с Threads, Workers и Stackables.

http://www.php.net/manual/en/book.pthreads.php

+0

pthreads не имитирует параллелизм, совсем ... –

+0

Вы правы. Я отредактировал ответ, чтобы решить эту проблему. – akkie

+0

Спасибо за самый полный ответ. – EricImprint

1

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

  1. один скрипт для каждого «длинной функции тузды»
  2. Использования AJAX для обработки каждого PHP скрипта, так что вы можете начать любой в то же время, если вы хотите. Сервер будет выполнять параллелизацию нагрузки.

Скажите, что вы думаете.

+0

Мне нравится идея, я надеялся на что-то более простое воплощение. – EricImprint

+0

это предельно просто. Ajax вписывается в 10 строк javascript. Если вы ленивы, вы можете даже скопировать пасту :-) – Sebas

+0

Я не много сделал с Ajax или javascript, так что даже если это просто, есть кривая обучения для меня, я надеялся пропустить. У вас есть пример, который вы бы рекомендовали ускорить мою кривую обучения? – EricImprint

Смежные вопросы