Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2023, 18:04   #1
Iskatel S
Пользователь
 
Регистрация: 16.06.2012
Сообщений: 27
По умолчанию Вызов скрипта из скрипта

Такой вопрос, как на PHP сделать вызов скрипта 2 из скрипта 1, чтобы в скрипт 1 после вызова продолжил свою работу, апосле завершения работы скрипта 1 скрипт 2 мог бы продолжать свою работу?
Iskatel S вне форума Ответить с цитированием
Старый 23.10.2023, 20:03   #2
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 481
По умолчанию

Зачем?
Valick на форуме Ответить с цитированием
Старый 24.10.2023, 08:42   #3
Iskatel S
Пользователь
 
Регистрация: 16.06.2012
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Зачем?
Ответ "нужно" не устроит? Просто программа, из которой вызывается скрипт 1 может приступить к выполнению следующего действия только после того как скрипт 1 завершится.
Iskatel S вне форума Ответить с цитированием
Старый 24.10.2023, 09:37   #4
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 481
По умолчанию

Цитата:
Сообщение от Iskatel S Посмотреть сообщение
Ответ "нужно" не устроит?
От от ответа на этот вопрос зависият варианты и целесообразность в целом ответа на первый вопрос.
Есть такое понятие как "проблема молотка". Внимательно прочитайте информацию по ссылке https://tproger.ru/explain/xyproblem Надеюсь это поможет задавать вопросы о самой проблеме, а не о варианте "решения" проблемы.
Valick на форуме Ответить с цитированием
Старый 24.10.2023, 09:43   #5
Liris
Пользователь
 
Регистрация: 09.05.2012
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Iskatel S Посмотреть сообщение
Ответ "нужно" не устроит?
Я бы тоже попросил уточнения. Не уверен, что прямой ответ на ваш вопрос поможет решить вашу задачу наилучшим образом.

Цитата:
Сообщение от Iskatel S Посмотреть сообщение
Просто программа, из которой вызывается скрипт 1 может приступить к выполнению следующего действия только после того как скрипт 1 завершится.
В целом, довольно много способов из скрипта 1 вызвать скрипт 2. В зависимости от обстоятельств, вы можете его просто подключить (include, require), или выполнить код из него (eval), или запустить скрипт (exec, shell-exec)...

Но если оба скрипта можно отнести к одному приложению, то я бы скорее предложил оформить выполняемый код в виде функции или класса...
Liris вне форума Ответить с цитированием
Старый 24.10.2023, 13:05   #6
Iskatel S
Пользователь
 
Регистрация: 16.06.2012
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
От от ответа на этот вопрос зависият варианты и целесообразность в целом ответа на первый вопрос.
Есть такое понятие как "проблема молотка". Внимательно прочитайте информацию по ссылке https://tproger.ru/explain/xyproblem Надеюсь это поможет задавать вопросы о самой проблеме, а не о варианте "решения" проблемы.
Описывать долго, но если вы настаиваете...
IP-АТС Asterisk поддерживает запуск скриптов, написанных на любом языке прямо из плана набора номеров.
Код:
exten => _8[3489]XXXXXXXX!,1,AGI(script1.php)
exten => _8[3489]XXXXXXXX!,n,Dial(SIP/station2/${EXTEN},60,r)
При поступлении звонка на номер, удовлетворяющий шаблону _8[3489]XXXXXXXX! будет выполнен скрипт /var/lib/asterisk/agi-bin/script1.php а по его завершении встроенная функция Dial(), при этом скрипту будут переданы некоторые параметры звонка через stdin. Приём этих параметров я реализовал так:
Код:
#!/usr/bin/php -q
<?php
   $stdinhandle =fopen('php://stdin', 'r');
   do {
      $fromstdin=fgets($stdinhandle);
      if (strstr($fromstdin, 'agi_channel: ') !== false) {
         $channel=trim(explode(': ', $fromstdin)[1]);
      };
      if (strstr($fromstdin, 'agi_callerid: ') !== false) {
         $callerid=trim(explode(': ', $fromstdin)[1]);
      };
      if (strstr($fromstdin, 'agi_extension: ') !== false) {
         $extension=trim(explode(': ', $fromstdin)[1]);
      };
      if ((isset($channel) and isset($callerid) and isset ($extension))==true) {
         break;
      }
   } while (feof($stdinhandle)==false);
   fclose($stdinhandle);
Дальше скрипт должен дождаться когда будет открыт голосовой канал, но открыт он будет функцией Dial() которая выполнится по завершении работы скрипта script1.php поэтому я решил сделать вызов скрипта 2, который будет взаимодействовать с астериском уже не через AGI, а через AMI интерфейс.
Iskatel S вне форума Ответить с цитированием
Старый 24.10.2023, 13:44   #7
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 481
По умолчанию

Я не знаком с IP-АТС Asterisk, трудно, что-то конкретное посоветовать. Но подозреваю, что можно изучить Swoole https://www.php.net/manual/ru/book.swoole.php для решения вопроса.
Valick на форуме Ответить с цитированием
Старый 30.12.2023, 10:13   #8
Ottava
Форумчанин
 
Регистрация: 05.09.2017
Сообщений: 157
По умолчанию

Для этих целей я использовал неблокирующийся сокет, который по GET дёргает PHP-скрипт (service.php), который нужно запустить.
Вот кусок кода для параллельного запуска скрипта service.php:
Код:
$fp = fsockopen($_SERVER['SERVER_NAME'], 80);				// SERVER_NAME should be sanized
if ($fp ===FALSE)  addDiag( 'fsocksopen(): Can`t open socket to '.$_SERVER['SERVER_NAME'] );
else {
  stream_set_blocking($fp, FALSE);					// Set non-blocking mode - it didn`t obstruct continue script execution
  $request = 'GET /path/service.php '.$_SERVER['SERVER_PROTOCOL']."\r\n".'Host: '.$_SERVER['SERVER_NAME']."\r\nConnection: Close\r\n\r\n";
  if (fwrite($fp, $request)) {						// Посылаем запрос
    $response = '';
    while (!feof($fp))  $response .= fgets($fp, 1024);			// Читаем ответ - надо убедиться, что service.php запустился
    // Наш service.php штатно возвращает `200 OK`, иначе 500 при ошибках PHP/MySQL
    if (!preg_match("#HTTP/[\d\.]+\s+200\s#i", $response))  addDiag( 'Failed to start service.php: '.$response );	// Скрипт service.php не запустился
    }
  else  addDiag( 'fwrite(): write to socket error' );
  @fclose($fp);
  }
addDiag() просто пишет ошибки в файл по register_shutdown_function(), иначе мы о них не узнаем.

Последний раз редактировалось Ottava; 30.12.2023 в 10:18.
Ottava вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов JS скрипта natter PHP 2 30.04.2021 13:37
Роутинг. Вызов скрипта без отображения в браузере begovik PHP 1 18.04.2019 18:50
Вызов внешней программы из скрипта Bekass ASP.NET 0 18.12.2011 01:22
вызов скрипта из C# приложения lorpine C# (си шарп) 1 14.03.2011 10:11
Удаленный вызов скрипта на веб сервере Garacio_cain Работа с сетью в Delphi 1 09.03.2009 22:39