Gateway Timeout php [dубликат]

Ответ на заданный вопрос - нет. Но вы смотрели на насмешливые рамки? Я использую 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);  }  
83
задан Michael Irigoyen 7 January 2011 в 16:10
поделиться

13 ответов

Выполнение некоторых экспериментов с 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 секунды)  
72
ответ дан Michael Irigoyen 15 August 2018 в 23:23
поделиться
  • 1
    Это отлично сработало для меня, спасибо – Tangocoder 23 August 2012 в 03:35
  • 2
    Благодарю. Это спасло мою жизнь. – Liam Bailey 12 January 2013 в 17:05
  • 3
    Что это за $ post_id после пути php-скрипта? – Perocat 27 April 2014 в 14:31
  • 4
    @Perocat - это переменная, которую вы отправляете в скрипт. В этом случае он отправляет идентификатор, который будет параметром для вызываемого сценария. – Chique 9 October 2014 в 21:05
  • 5
    В ожидании редактирования предлагается $ post_id ; Я предпочел бы использовать его непосредственно для числа: (int) $ post_id . (Вызовите для вашего внимания, чтобы решить, что лучше.) – Al.G. 28 September 2017 в 22:03

Как насчет этого?

  1. Ваш скрипт PHP, который содержит форму, сохраняет флаг или какое-то значение в базе данных или файле.
  2. Второй опрос PHP-скриптов для этого (! d1)

Этот второй скрипт PHP должен быть запущен как cron.

4
ответ дан adarshr 15 August 2018 в 23:23
поделиться
  • 1
    Спасибо, но я обновил исходный вопрос. В этом случае Cron не являются вариантом. – Michael Irigoyen 7 January 2011 в 16:11

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

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

2
ответ дан Community 15 August 2018 в 23:23
поделиться
  • 1
    Спасибо, но я обновил исходный вопрос. В этом случае Cron не являются вариантом. – Michael Irigoyen 7 January 2011 в 16:11

Из всех ответов никто не рассматривал смехотворно легкую функцию fastcgi_finish_request , которая при вызове сбрасывает весь оставшийся вывод в браузер и закрывает сеанс Fastcgi и HTTP-соединение, позволяя сценарию запускаться в фон.

Пример:

  & lt;? php header ('Content-Type: application / json');  echo json_encode (['ok' = & gt; true]);  fastcgi_finish_request ();  // Пользователь теперь отключен от скрипта // делает материал с полученными данными,  
2
ответ дан Danogentili 15 August 2018 в 23:23
поделиться

В моем случае у меня есть 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];   
0
ответ дан Hernaldo Gonzalez 15 August 2018 в 23:23
поделиться

Если вы работаете в 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;   
2
ответ дан i am ArbZ 15 August 2018 в 23:23
поделиться
  • 1
    Извините за редактирование впоследствии для im, используя мой мобильный телефон, и действительно, это намного сложнее, чем писать скрипт exec (). Лол ;) – i am ArbZ 9 May 2014 в 21:18

Фоновая работа cron звучит как хорошая идея для этого.

Вам понадобится ssh доступ к машине для запуска скрипта как cron.

$ php scriptname.php , чтобы запустить его.

3
ответ дан Ian 15 August 2018 в 23:23
поделиться
  • 1
    нет необходимости в ssh. Многие хосты запрещают ssh, но имеют cron-поддержку. – Teson 7 January 2011 в 16:10
  • 2
    Спасибо, но я обновил исходный вопрос. В этом случае Cron не являются вариантом. – Michael Irigoyen 7 January 2011 в 16:12

Как я знаю, вы не можете сделать это простым способом (см. fork exec и т. д. (не работают под окнами)), возможно, вы можете отменить подход, используйте фон браузера, отправив форму в ajax, так что если пост все еще работает, у вас нет времени ожидания. Это может помочь, даже если вам нужно сделать долгую разработку. При отправке почты всегда предлагается использовать спулер, может быть локальный & amp; быстрый smtp-сервер, который принимает ваши запросы и связывает их с реальным MTA или помещает все в БД, чем использовать cron, который заполняет очередь. Cron может находиться на другой машине, вызывающей спулер в качестве внешнего url:

  * * * * * wget -O / dev / null http://www.example.com/spooler.php [  ! d0] 
4
ответ дан Ivan Buttinoni 15 August 2018 в 23:23
поделиться

Более простой способ запуска PHP-скрипта в фоновом режиме -

  php script.php & gt; / dev / null & amp;   

Скрипт будет работать в фоновом режиме, и страница также будет быстрее доходить до страницы действия.

3
ответ дан LSerni 15 August 2018 в 23:23
поделиться

На серверах 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; . Сценарий будет продолжен, даже если исходный скрипт закончился.

16
ответ дан netcoder 15 August 2018 в 23:23
поделиться
  • 1
    Это работает, когда я не вызываю proc_close , когда задача завершена. proc_close заставляет скрипт зависеть от 15 до 25 секунд. Мне нужно было бы вести журнал, используя информацию о канале, поэтому мне нужно открыть файл для записи, закрыть его и закрыть соединение proc. Поэтому, к сожалению, это решение не работает для меня. – Michael Irigoyen 7 January 2011 в 18:10
  • 2
    Конечно, вы не называете proc_close , вот в чем смысл! И да, вы можете подключиться к файлу с помощью proc_open . См. Обновленный ответ. – netcoder 7 January 2011 в 18:19
  • 3
    @netcoder: что делать, если я не хочу сохранять результат в любом файле. какие изменения требуются в стандартном режиме? – naggarwal11 25 December 2015 в 12:23

Если вы можете получить доступ к серверу через ssh и можете запускать свои собственные скрипты, вы можете сделать простой сервер fifo, используя php (хотя вам придется перекомпилировать php с поддержкой posix для fork [ ! d2]).

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

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

Пример сервера :

  & 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;   
3
ответ дан OneOfOne 15 August 2018 в 23:23
поделиться

PHP exec («php script.php») может это сделать.

Из руководства Manual :

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

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

6
ответ дан Simon 15 August 2018 в 23:23
поделиться
  • 1
    Спасибо, но это не сработало. Сценарий все еще «висит» & quot; в то время как он обрабатывает второй файл. – Michael Irigoyen 7 January 2011 в 16:18
  • 2
    Посмотрите на commend php.net/manual/en/function.exec.php#80582 Кажется, что это связано с тем, что Safe_mode включен. Существует временное решение для unix. – Simon 7 January 2011 в 16:21
  • 3
    К сожалению, безопасный режим не включен в нашей установке. Странно, что он все еще висит. – Michael Irigoyen 7 January 2011 в 18:04

И почему бы не сделать HTTP-запрос на скрипт и игнорировать ответ?

http://php.net/manual/en/function.httprequest-send.php

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

5
ответ дан Twister 15 August 2018 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: