복붙노트

명령이 완료되기를 기다리지 않고 shell_exec을 사용할 수 있습니까?

PHP

명령이 완료되기를 기다리지 않고 shell_exec을 사용할 수 있습니까?

백그라운드에서 실행하고 싶은 프로세스 집약적 인 작업이 있습니다.

사용자가 페이지를 클릭하면 PHP 스크립트가 실행되고 마지막으로 조건에 따라 필요한 경우 쉘 스크립트 인 E.G .:를 실행해야합니다.

shell_exec('php measurePerformance.php 47 844 email@yahoo.com');

현재 shell_exec을 사용하고 있지만, 스크립트가 출력을 기다려야합니다. 완료되기를 기다리지 않고 원하는 명령을 실행할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.방법에 대해 추가하십시오.

    방법에 대해 추가하십시오.

    "> /dev/null 2>/dev/null &"
    
    shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &');
    

    이것은 stdio와 stderr를 제거합니다.

  2. ==============================

    2.이렇게하면 명령이 실행되고 실행중인 프로세스와의 연결이 끊어집니다. 물론 원하는 모든 명령이 가능합니다. 그러나 테스트를 위해 sleep (20) 명령을 사용하여 PHP 파일을 만들 수 있습니다.

    이렇게하면 명령이 실행되고 실행중인 프로세스와의 연결이 끊어집니다. 물론 원하는 모든 명령이 가능합니다. 그러나 테스트를 위해 sleep (20) 명령을 사용하여 PHP 파일을 만들 수 있습니다.

    exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");
    
  3. ==============================

    3.또한 출력을 즉시 클라이언트에 제공하고 나중에 PHP 코드를 계속 처리 할 수 ​​있습니다.

    또한 출력을 즉시 클라이언트에 제공하고 나중에 PHP 코드를 계속 처리 할 수 ​​있습니다.

    이것은 오랫동안 대기중인 Ajax 호출에 대해 클라이언트 측에 아무런 영향을주지 않을 방법을 사용하는 방법입니다.

    ob_end_clean();
    ignore_user_abort();
    ob_start();
    header("Connection: close");
    echo json_encode($out);
    header("Content-Length: " . ob_get_length());
    ob_end_flush();
    flush();
    // execute your command here. client will not wait for response, it already has one above.
    

    자세한 설명은 http://oytun.co/response-now-process-later에서 확인할 수 있습니다.

  4. ==============================

    4.Windows 2003에서는 기다리지 않고 다른 스크립트를 호출하기 위해 다음과 같이 사용했습니다.

    Windows 2003에서는 기다리지 않고 다른 스크립트를 호출하기 위해 다음과 같이 사용했습니다.

    $commandString = "start /b c:\\php\\php.EXE C:\\Inetpub\\wwwroot\\mysite.com\\phpforktest.php --passmsg=$testmsg"; 
    pclose(popen($commandString, 'r'));
    

    이것은 cmd.exe에 대한 변경 권한을 부여한 후에 만 ​​작동합니다. IUSR_YOURMACHINE에 대한 읽기 및 실행을 추가합니다 (또한 쓰기를 거부로 설정).

  5. ==============================

    5.PHP의 popen 명령을 사용하십시오 (예 :

    PHP의 popen 명령을 사용하십시오 (예 :

    pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));
    

    그러면 하위 프로세스가 생성되고 스크립트는 출력을 기다리지 않고 백그라운드에서 실행됩니다.

  6. ==============================

    6.물론, 윈도우에서는 다음을 사용할 수 있습니다.

    물론, 윈도우에서는 다음을 사용할 수 있습니다.

    $WshShell = new COM("WScript.Shell");
    $oExec = $WshShell->Run("C:/path/to/php-win.exe -f C:/path/to/script.php", 0, false);
    

    노트 :

    COM 오류가 발생하면 php.ini에 확장을 추가하고 apache를 다시 시작하십시오.

    [COM_DOT_NET]
    extension=php_com_dotnet.dll
    
  7. ==============================

    7.그래도 작동 할 것이지만 백그라운드에서 실행될이 함수를 호출 할 때마다 새로운 프로세스를 만들 것이므로 서버에 과부하가 걸리지 않도록주의해야합니다. 동시에 하나의 동시 호출 만있는 경우이 해결 방법으로 작업을 수행 할 수 있습니다.

    그래도 작동 할 것이지만 백그라운드에서 실행될이 함수를 호출 할 때마다 새로운 프로세스를 만들 것이므로 서버에 과부하가 걸리지 않도록주의해야합니다. 동시에 하나의 동시 호출 만있는 경우이 해결 방법으로 작업을 수행 할 수 있습니다.

    그렇지 않다면 예를 들어 beanstalkd / gearman / amazon sqs와 같은 메시지 대기열을 실행하는 데 도움이됩니다.

  8. ==============================

    8.웹 페이지가 아닌 경우, 어떤 종류의 신호 (디렉토리에 파일을 놓기 등)를 생성하고 cron 작업을 수행해야하는 작업을 선택하는 것이 좋습니다. 그렇지 않으면 아파치 프로세스 내부에서 pcntl_fork ()와 exec ()를 사용하는 영역에 들어갈 가능성이 높습니다.

    웹 페이지가 아닌 경우, 어떤 종류의 신호 (디렉토리에 파일을 놓기 등)를 생성하고 cron 작업을 수행해야하는 작업을 선택하는 것이 좋습니다. 그렇지 않으면 아파치 프로세스 내부에서 pcntl_fork ()와 exec ()를 사용하는 영역에 들어갈 가능성이 높습니다.

  9. ==============================

    9.shell_exec ()를 호출하는 페이지에 항상 AJAX를 게시 할 수 있습니다.

    shell_exec ()를 호출하는 페이지에 항상 AJAX를 게시 할 수 있습니다.

  10. from https://stackoverflow.com/questions/1019867/is-there-a-way-to-use-shell-exec-without-waiting-for-the-command-to-complete by cc-by-sa and MIT license