2011-11-09 3 views
1

나는 사용자가 이미지를 업로드 할 수있는 포럼을 구축 중입니다. S3 버킷으로 이동하기 전에 이미지가 내 웹 서버에 일시적으로 저장되므로 (진행 막대와 함께 업로드 할 수 있음) 나는이 일의 화려한 방법을 생각하지 않은,하지만 난 다음이 의미있게 생각한다다른 스크립트에서 PHP 스크립트 요청 및 이동

  1. 이미지 업로드 (들) 사용자가 제출하는 진행률 표시 줄
  2. 기다립니다 XHR을 사용하여 웹 서버를 자신의
  3. 링크 해제 이미지를 게시 그는 자신의 게시물
  4. 전화 (완료되면 사후 몸에 업데이트 이미지 URL) S3에 남아있는 이미지를 업로드 URL을
  5. 리디렉션 사용자에 포함하여 최대 끝나지 않았다 그의주제에 게시

이제 4 단계에서 상당한 시간이 걸릴 수 있으므로 백그라운드에서 S3 업로드 스크립트를 호출 할 수 있고 사용자 대기가없는 솔루션과 같은 cron을 찾고 있습니다. 그것을 완료하십시오.

http://mysite.com/utils/move-to-s3/?images=1,2,3 

내가 이것에 대한 컬을 사용할 수 :

적으로는, 내가 나를 내 프레임 워크 내에서 URL 을 요청하고 검색어의 일부 이미지 ID에게의를 통과 할 수있는 솔루션, 즉 찾고 있어요 목적? 또는 exec()가 필요한 경우 PHP 스크립트 (php-cli) 대신 URL (wget?)을 실행할 수 있습니까?

감사합니다.

답변

0

은 내가 공유 할 행복 해요이 문제에 대한 해결책을 발견했다. 실제로 SO에서 찾았지만 약간의 조정이 필요했습니다. 여기 간다 :

  1. 이 솔루션은 exec() 또는 shell_exec() 중 하나가 필요합니다. 그것은 모든 출력이 어쨌든 버려지기 때문에 당신이 사용하는 것이 중요하지 않습니다. 나는 exec()을 선택했다.

  2. 시스템 수준의 PHP 설치가 아닌 MAMP를 사용하고 있으므로 MAMP 패키지 내에있는 PHP 바이너리를 가리켜 야했습니다.(이것은 실제로 차이를 만들었습니다.)이 경로를 PHP_BIN이라는 상수로 정의하기로 결정 했으므로 로컬 및 라이브 환경에 대해 다른 경로를 설정할 수 있습니다. 이 경우 :

  3. define(PHP_BIN, '/Applications/MAMP/bin/php/php5.3.6/bin/php'); 이상적으로, 내 웹 프레임 워크 대신에 일부 고립 된 쉘 스크립트 내에서 스크립트를 실행하고 싶었다. 나는 인자로 URL을 허용하는 래퍼 스크립트를 작성하고 그것을 my_curl.php 이름 :

    if(isset($argv[1])) 
    { 
        $url = $argv[1]; 
    
        if(preg_match('/^http(s)?:\/\//', $url)) 
        { 
         $ch = curl_init(); 
         curl_setopt($ch, CURLOPT_URL, $url); 
         curl_setopt($ch, CURLOPT_HEADER, 0); 
         curl_exec($ch); 
         curl_close($ch); 
        } 
    } 
    
  4. this SO question에서 나는 백그라운드에서 쉘 명령을 실행하는 방법을 발견했다. 사용자가 완료 될 때까지 기다리지 않아도되기 때문에 필요합니다.

  5. 마지막으로, 나는 백그라운드에서 다른 (또는) 웹 요청을 실행하는 PHP 코드의이 비트를 실행 : 마법처럼

    exec(PHP_BIN . ' /path/to/my_curl.php http://site.com/url/to/request 
    &> /dev/null &'); 
    

작품! 희망이 도움이됩니다.

1

PHP의

register_shutdown_function() 

당신의 친구 [reference]입니다.

종료 기능은 스크립트가 종료되는 동안 계속 실행됩니다.

따라서 모든 것이 가능하면 피날레 페이지와 exit을 제출하십시오. 등록 된 시스템 종료 기능이 계속해서 시간 소모적 인 작업을 수행합니다.

제 경우에는 스크립트 종료 후 여러 메소드를 등록 할 수있는 클래스 CShutdownManager을 준비했습니다. 예를 들어, 더 이상 필요하지 않은 임시 파일을 삭제하려면 CShutdownManager을 사용합니다.

+0

결코 들어 본 적이 없지만 * 정확하게 * 필요한 것 같습니다 :) 감사합니다! – oscaralexander

+0

몇 명의 사람들이이 방법을 사용했습니다. 그리고 더 흥미로운 것들을 발견 할 수 있습니다 ;-) 투표를하는 것을 잊지 말고 대답을 받아 들여야합니다 ... – SteAp

+0

아, 설명서에서 찾을 수없는 것 : 전화를 걸면 종료 기능이 여전히 실행됩니까? 나가기 대신 헤더 리디렉션? 말했듯이, 나는 그의 게시물을 처리 한 후에 사용자를 주제 페이지로 리디렉션해야합니다. – oscaralexander

0

는 다음과 같은 성명을 시도해보십시오

shell_exec(php scriptname); 
관련 문제