Ответ на заданный вопрос - нет. Но вы смотрели на насмешливые рамки? Я использую MOQ, но там их миллионы, и они позволяют вам реализовать / заглушить (частично или полностью) интерфейсы в режиме онлайн. Например:
public void ThisWillWork () {var source = new DummySource [0]; var mock = new Mock & lt; DummyInterface & gt; (); mock.SetupProperty (m = & gt; m.A, source.Select (s = & gt; s.A)); mock.SetupProperty (m = & gt; m.B, source.Select (s = & gt; s.C + "_" + s.D)); DoSomethingWithDummyInterface (mock.Object); }
Выполнение некоторых экспериментов с exec
и shell_exec
Я раскрыл решение, которое отлично работало! Я решил использовать shell_exec
, чтобы я мог регистрировать каждый процесс уведомления, который происходит (или нет). ( shell_exec
возвращается как строка, и это было проще, чем использование exec
, назначение вывода переменной, а затем открытие файла для записи.)
Я использую следующую строку для вызова сценария электронной почты:
shell_exec ("/ path / to / php /path/to/send_notifications.php" ". $ Post_id." ' alert '& gt; /path/to/alert_log/paging.log & amp; ");
Важно отметить & amp;
в конце команды (как указано @netcoder). Эта команда UNIX запускает процесс в фоновом режиме.
Дополнительные переменные, окруженные в одинарных кавычках после пути к скрипту, устанавливаются как переменные $ _ SERVER ['argv']
, которые я может вызвать внутри моего скрипта.
Затем сценарий электронной почты выводится в мой файл журнала с помощью & gt; & gt;
и выводит что-то вроде этого:
[2011-01 -07 11:01:26] Уведомления об оповещении отправлены для http://alerts.illinoisstate.edu/2049 (SCRIPT: 38.71 секунд) [2011-01-07 11:01:34] КРИТИЧЕСКАЯ ОШИБКА: Уведомления оповещения НЕ отправлены на http : //alerts.illinoisstate.edu/2049 (SCRIPT: 23.12 секунды)
Как насчет этого?
Этот второй скрипт PHP должен быть запущен как cron.
для рабочего фона. Я думаю, что вы должны попробовать этот метод, это поможет назвать столько страниц, сколько вам понравится, все страницы будут выполняться сразу независимо, не ожидая, что каждый ответ на страницу будет асинхронным.
form_action_page.php
& lt;? php post_async ("http: //localhost/projectname/testpage.php", "Keywordname = testValue"); //post_async("http://localhost/projectname/testpage.php "," Keywordname = testValue2 "); //post_async("http://localhost/projectname/otherpage.php "," Keywordname = anyValue "); // вызываем столько страниц, сколько вам понравится, все страницы будут выполняться сразу // независимо, не ожидая, что каждый ответ на страницу будет асинхронным. // ваша вставка формы db или другой код идет здесь, что бы вы хотели, // код выше будет работать как фоновое задание, эта строка будет нажимать прямо перед ответом на вышеприведенные строки? & gt; & lt;? php / * * Асинхронно выполняет асинхронную страницу PHP, поэтому текущая страница не должна ждать завершения ее работы. * * / function post_async ($ url, $ params) {$ post_string = $ params; $ частей = parse_url ($ URL); $ fp = fsockopen ($ parts ['host'], isset ($ parts ['port'])? $ parts ['port']: 80, $ errno, $ errstr, 30); $ out = "GET". $ parts ['path']. "? $ post_string". "HTTP / 1.1 \r \n"; // вы можете использовать POST вместо GET, если вам нравится $ out. = "Host: ». $ части [ 'хозяин']. "\ г \n"; $ out. = "Content-Type: application / x-www-form-urlencoded \r \n"; $ out. = "Content-Length:" .strlen ($ post_string). "\r \n"; $ out. = "Соединение: Закрыть \r \n \r \n"; fwrite ($ fp, $ out); fclose ($ FP); }? & gt;
testpage.php
& lt ;? echo $ _REQUEST ["Keywordname"]; // case1 Output & gt; testValue // здесь выполняются фоновые операции, он не остановит главную страницу? & gt;
PS: если вы хотите отправить параметры URL-адреса в виде цикла, выполните следующий ответ: https://stackoverflow.com/a/41225209/6295712
Из всех ответов никто не рассматривал смехотворно легкую функцию fastcgi_finish_request , которая при вызове сбрасывает весь оставшийся вывод в браузер и закрывает сеанс Fastcgi и HTTP-соединение, позволяя сценарию запускаться в фон.
Пример:
& lt;? php header ('Content-Type: application / json'); echo json_encode (['ok' = & gt; true]); fastcgi_finish_request (); // Пользователь теперь отключен от скрипта // делает материал с полученными данными,
В моем случае у меня есть 3 параметра, один из которых - строка (mensaje):
exec ("C: \ wamp \ bin \ php \ php5.5.12 \ php.exe C : /test/N/trunk/api/v1/Process.php $ idTest2 $ idTest3 \ "$ mensaje \" & gt; c: /log.log & amp; ");
В моем Process.php у меня есть этот код:
, если (! isset ($ argv [1]) ||! isset ($ argv [ 2]) ||! Isset ($ argv [3])) {die ("Ошибка."); } $ idCurso = $ argv [1]; $ idDestino = $ argv [2]; $ mensaje = $ argv [3];
Если вы работаете в Windows, исследование proc_open
или popen
...
Но если мы находимся на одном сервере «Linux», Если вы используете cpanel, то это правильный подход:
#! / usr / bin / php & lt;? php $ pid = shell_exec («nohup nice php -f» path / to / your / script .php '/ dev / null 2 & amp; 1 & amp; echo $! "); Хотя (exec ("ps $ pid")) {// у вас также может быть стример, например fprintf, // или fgets}? & Gt;
Не используйте fork ()
или curl
, если вы сомневаетесь, что сможете справиться с ними, это просто как злоупотребление вашим сервером
Наконец, в файле script.php
, который вызывается выше, обратите внимание на это, убедитесь, что вы написали:
& lt;? php ignore_user_abort ( ПРАВДА); set_time_limit (0); ob_start (); // & lt; - действительно необязательно, но это чистый php // Код для тестирования на фоне ob_flush (); промывать(); // это два процесса вывода, если вам это нужно. // затем сделать всю возможную логику str_repeat ("", 1500); //. для выполнения баров или загрузки изображений сна (2); // стандартный лимит? & gt;
Фоновая работа cron звучит как хорошая идея для этого.
Вам понадобится ssh доступ к машине для запуска скрипта как cron.
$ php scriptname.php
, чтобы запустить его.
Как я знаю, вы не можете сделать это простым способом (см. fork exec и т. д. (не работают под окнами)), возможно, вы можете отменить подход, используйте фон браузера, отправив форму в ajax, так что если пост все еще работает, у вас нет времени ожидания. Это может помочь, даже если вам нужно сделать долгую разработку. При отправке почты всегда предлагается использовать спулер, может быть локальный & amp; быстрый smtp-сервер, который принимает ваши запросы и связывает их с реальным MTA или помещает все в БД, чем использовать cron, который заполняет очередь. Cron может находиться на другой машине, вызывающей спулер в качестве внешнего url:
* * * * * wget -O / dev / null http://www.example.com/spooler.php [ ! d0]
Более простой способ запуска PHP-скрипта в фоновом режиме -
php script.php & gt; / dev / null & amp;
Скрипт будет работать в фоновом режиме, и страница также будет быстрее доходить до страницы действия.
На серверах Linux / Unix вы можете выполнить задание в фоновом режиме с помощью proc_open :
$ descriptorspec = array (array ('pipe', ' r '), // stdin array (' file ',' myfile.txt ',' a '), // stdout array (' pipe ',' w '), // stderr); $ proc = proc_open ('php email_script.php & amp;', $ descriptorspec, $ pipes);
Здесь важный бит здесь & amp;
. Сценарий будет продолжен, даже если исходный скрипт закончился.
proc_close
, когда задача завершена. proc_close
заставляет скрипт зависеть от 15 до 25 секунд. Мне нужно было бы вести журнал, используя информацию о канале, поэтому мне нужно открыть файл для записи, закрыть его и закрыть соединение proc. Поэтому, к сожалению, это решение не работает для меня.
– Michael Irigoyen
7 January 2011 в 18:10
proc_close
, вот в чем смысл! И да, вы можете подключиться к файлу с помощью proc_open
. См. Обновленный ответ.
– netcoder
7 January 2011 в 18:19
Если вы можете получить доступ к серверу через ssh и можете запускать свои собственные скрипты, вы можете сделать простой сервер fifo, используя php (хотя вам придется перекомпилировать php с поддержкой Сервер может быть написан во что угодно, вы, вероятно, можете легко это сделать в python. Или простейшим решением будет отправка HttpRequest и не чтение возвращаемых данных, но сервер может уничтожить скрипт до его завершения. Пример сервера : Пример клиента: posix
для fork [ ! d2]).
& lt;? php define ('FIFO_PATH', '/home/user/input.queue'); define ('FORK_COUNT', 10); if (file_exists (FIFO_PATH)) {die (FIFO_PATH. 'существует, удалите его и повторите попытку. "." \n "); } if (! file_exists (FIFO_PATH) & amp;! posix_mkfifo (FIFO_PATH, 0666)) {die ('Невозможно создать прослушивание fifo.'. "\n"); } $ pids = array (); $ fp = fopen (FIFO_PATH, 'r +'); for ($ i = 0; $ i & lt; FORK_COUNT; ++ $ i) {$ pids [$ i] = pcntl_fork (); if (! $ pids [$ i]) {echo "process (". posix_getpid (). ", id = $ i) \n"; while (true) {$ line = chop (fgets ($ fp)); if ($ line == 'quit' || $ line === false) break; echo "(". posix_getpid (). ", id = $ i) :: $ line \n"; // $ data = json_decode ($ line); // processData ($ data); } Выход(); }} fclose ($ fp); foreach ($ pids as $ pid) {pcntl_waitpid ($ pid, $ status); } unlink (FIFO_PATH); ? & GT;
& lt;? php define ('FIFO_PATH', '/home/user/input.queue'); if (! file_exists (FIFO_PATH)) {die (FIFO_PATH. 'не существует, убедитесь, что сервер fifo запущен.'. "\n"); } function postToQueue ($ data) {$ fp = fopen (FIFO_PATH, 'w +'); stream_set_blocking ($ fp, false); // не блокируем $ data = json_encode ($ data). "\n"; if (fwrite ($ fp, $ data)! = strlen ($ data)) {echo "Не мог сервер быть мертвым или где-то ошибка? \n"; } fclose ($ fp); } $ i = 1000; while (- $ i) {postToQueue (массив ('xx' = & gt; 21, 'yy' = & gt; array (1,2,3))); }? & gt;
PHP exec («php script.php»)
может это сделать.
Из руководства Manual :
Если программа запускается с этой функцией, чтобы она продолжала работать в фоновом режиме, выход программы должен быть перенаправлен в файл или другой выходной поток. В противном случае PHP зависнет до тех пор, пока выполнение программы не закончится.
Итак, если вы перенаправляете вывод в файл журнала (что в любом случае является хорошей идеей), ваш вызывающий скрипт не будет зависать, и ваш скрипт электронной почты будет запущен в bg.
И почему бы не сделать HTTP-запрос на скрипт и игнорировать ответ?
http://php.net/manual/en/function.httprequest-send.php
Если вы сделаете свой запрос на скрипт, вам нужно позвонить на ваш веб-сервер, он запустит его в фоновом режиме, и вы можете (в своем основном скрипте) показать сообщение, сообщающее пользователю, что скрипт запущен.
$ post_id
после пути php-скрипта? – Perocat 27 April 2014 в 14:31$ post_id
; Я предпочел бы использовать его непосредственно для числа:(int) $ post_id
. (Вызовите для вашего внимания, чтобы решить, что лучше.) – Al.G. 28 September 2017 в 22:03