2010-03-16 2 views
13

우리는 Windows 서버에서 PHP를 실행 중입니다. 실제로 많은 문제가 발생하지만 현재로서는 마이그레이션 옵션이 없습니다. 사용자가 시작한 작업에는 일정 시간이 소요되는 몇 가지 사항을 시작해야하며 사용자가 성공 또는 실패했는지 여부를 알 필요가없는 몇 가지 사항이 있습니다 (예 : 이메일 발송 또는 일부 확인 제 3 자 계정이 업데이트됩니다. pcntl_fork()으로 포크 할 수 있으면 매우 간단하지만 Windows에서는 PCNTL 기능을 사용할 수 없습니다.Windows에서 PHP로 포킹

exec('php-cgi.exe somescript.php'); 

그러나이 훨씬 더 복잡 할 것 :

내가 얻을 수있는 가장 가까운 이러한 성격의 무언가를해야 할 것 같다. 내가 시작해야 할 행동은 이미 실행중인 프로세스에 존재할 많은 컨텍스트에 의존합니다. 위의 예제를 사용하려면 필자는 필수 데이터를 찾아내어 새로운 스크립트에 어떤 식 으로든 제공해야합니다. 제가 포크를 잡을 수 있다면, 부모 프로세스가 일찍 돌아와서 아이가 몇 가지 일을 더 많이하도록 할 수 있습니다.

Windows에서 컴파일 된 다양한 PCNTL 기능을 얻는 데있어서 자신의 작업에 대해 이야기하는 사람이 몇 명 있었지만 사용할 수있는 링크가없는 것 같았습니다.

this question에도 불구하고 사실상 동일한 이름을 가지고 있지만, 문제는 fork 할 필요보다 실행 시간 초과가 더 많이 걸린 것처럼 보입니다. 그래서, php-cgi를 호출하는 것에 대해 리펙토링하기위한 최선의 선택이 있습니까? 아니면 다른 옵션이 있습니까?

편집 : exec()이 작동하지 않을 것입니다. 최소한 전화를 다시받을 때까지 기다릴 때까지 다른 측면을 생각하지 않아도됩니다. 나는 START 같은 일종의 exec('start php-cgi.exe somescript.php');을 사용할 수 있다고 생각했지만 다른 스크립트가 끝날 때까지 계속 대기합니다.

+0

당신은 이것을 위해 크론 작업을 고려 했습니까? (몇 가지 옵션이 있습니다. http://www.google.com/search?q = cron + windows) – user187291

+0

필자가 볼 수 있듯이 psexec을 사용하는 것만 큼 효과가있는 것처럼 보입니다. 그러나 방금 psexec을 사용하여 작업 할 수있게되었습니다. –

답변

13

방법 installing psexec에 대한 및 사용 -d (기다리지 않는다) option

exec('psexec -d php-cgi.exe somescript.php'); 
+0

훌륭해, 나는 일하도록했다. 나는 왜'start'로 exec'ing이 내가 필요한 것을 할 수 없었던 지 혼란 스럽다. 또한 psexec를 -accepteula 매개 변수와 함께 호출 할 필요가있었습니다. 수동 매개 변수를 서버에서 직접 수동으로 수락 했더라도 마찬가지였습니다. –

+0

변수를 전달할 방법을 찾고 있다면이'exec ("psexec -d php-cgi.exe somescript.php 'var1' 'var2' 'var3'")를 사용하십시오. 그러면 PHP 스크립트에서 ' 변수를 보내고'$ argv [1]',''$ argv [2]','$ argv [3]'를 사용하십시오. –

3

PSExec를 확인하고 명령을 실행 : 당신은을 실행하는 데몬/백그라운드 프로세스를 생성 할 수 있습니다

exec("psexec -d php-cgi.exe myfile.php"); 
+2

이 답변은 링크가 있지만 다른 링크는 없습니다. – SeanDowney

1

을 코드 (예 : 전자 메일 전송)와 요청은 대기열에 항목을 추가해야하며, deamon이 무거운 짐을 덜어 주도록하십시오.

예를 들어

, 파일 send_emails.bat :

cls 
C:\PHP533\php.exe D:\web\server.php 
exit 

열려있는 창 작업 스케줄러, 그리고 위의 send_emails.bat가 매 30 분 간격으로 운행합니다. 한 번에 하나의 인스턴스 만 실행하거나 각 작업을 여러 번 실행하거나 각 이메일을 두 번 보낼 수 있습니다. 일시적으로 문제가 발생하는 경우 (메모리 문제, 데이터베이스를 사용할 수없는 경우 등) 30 분을 말합니다. 멈추지 않는 프로세스가 없기 때문에 30 분마다 다시 시작됩니다. 다음은 골격 데몬이되어 다음 ... 완료되지 또는 난 그냥 예를 들어 밖을 입력하고 테스트 :

<?php 
set_time_limit(60*30); // don't run 
$keepgoing = true; 
$timeout = time()+ 60*29; // 29 minutes 

while(time() < $timeout) 
{ 
    // grab emails from database 
    $result = $db->query('select subject, body, to_email FROM email_queue'); 
    if($result->num_rows == 0) 
    { 
     sleep(10); // so we are not taxing the database 
    } 
    else 
    { 
     while($row = $result->fetch_assoc()) 
     { 
     // send email 
     } 
    } 
} 
exit; 
?> 

마지막으로 그냥 데이터베이스에 큐에 상품을 추가하고, 데몬 핸들을 수 있도록 요청을해야합니다을 무거운 짐을 싣기.

$db->query('insert into email_queue(to,subject,body) values ('[email protected]','important email','<b>html body!</b>'); 
관련 문제