2012-02-03 5 views
17

크론 작업을 실행하고 싶습니다. 내 응용 프로그램은 PHP와 MySQL로 개발되었습니다.

브라우저에서 코드에 $_SERVER[HTTP_HOST]을 사용하면 정상적으로 작동합니다. 그러나 내가 cron 작업에서 같은 것을 사용하면 오류가 발생합니다.

어떤 신체가 이것을 고칠 수있는 제안을 할 수 있습니까?

+0

어떤 종류의 몇 가지 오류 메시지를 제공하십시오처럼 리눅스에서

구문입니다. 아마도 $ _SERVER [ 'HTTP_HOST']는 cron 스크립트로 인해 정의되지 않았기 때문에 브라우저처럼 HTTP_HOST가 정의되어 있지 않습니까? 당신은 isset ($ _ SERVER [ 'HTTP_HOST'])로 테스트 할 수 있습니다. –

+0

php> = 5.3.0 gethostname() 사용 – nick

답변

16

$_SERVER['HTTP_HOST']은 cronjob에서 실행할 때 채워지지 않습니다. 파일은 HTTP를 통해 액세스되지 않습니다.

호스트를 하드 코딩하거나 명령 줄 인수를 통해 전달하고 $_SERVER['argv'] 어레이를 통해 액세스해야합니다.

+0

좋은 대답. CLI 스크립트에는 액세스 할 수있는 $ argv 및 $ argc 전역이 있으므로 $ _SERVER를 사용할 필요가 없습니다. –

+1

'$ argv'는 global-keyword가없는 함수에서는 사용할 수 없습니다. '$ _SERVER'는 슈퍼 글로벌입니다. – TimWolla

2

비어있는 경우 $_SERVER[HTTP_HOST] 값을 하드 코드하거나 다른 검사를 수행 할 수 있습니다.

6

php가 명령 줄에서 실행될 때 $_SERVER['HTTP_HOST']은 (물론) 사용할 수 없습니다.

당신은 단지 @ 기호를 사용하여 오류를 억제하거나 구조 줄을 사용하여 좀 더 신중 될 수 있습니다

이전에 언급 한 바와 같이
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'CLI'; 
6

당신이 PHP-CLI를 통해 PHP를 실행할 때, $의 _SERVER가 존재하지 않습니다.

하지만 PHP-cgi에서 cron'd 스크립트를 실행하는 옵션이 있습니다. 여기에 $ _SERVER가 있습니다. 로컬 웹 서버로 컬링하면 $ _SERVER가 채워집니다.

$ cat /etc/cron.daily/mydailyphpwork 
/usr/bin/curl http://domain.tld/path/to/cron-script.php &> /dev/null 

그러나, 당신이 정말로 당신이 정말로이 동작을 필요로하지 않는 한, TimWolla 또는 DerVO에 의해 제안 된 솔루션을 충실해야한다고 생각합니다.

장점 :

  • 당신은 예상대로 설정된 모든 $ _SERVER 변수를 얻을 것이다.
  • if-else로 많은 코드를 다시 작성해야하는 경우 코드를 변경할 필요가 없으므로이 방법을 사용하는 것이 좋습니다.

단점 :

  • 그것은 대안의 종류 및 아마 CPU 부하에 약간의 증가를 의미한다.
4

curl을 사용하여 cron 작업을 실행 해보십시오. $ _SERVER [ 'HTTP_HOST']이 (가) 채워집니다.

curl http://yourdomain/yourfile.php 
+1

이것은 파일이 공개 URL에있는 한 내 마음 속에서 가장 솔직한 해결책이었습니다. AronCederholm도 비슷한 제안을했지만 요점을 올바르게 대답하기 위해 @alwaysLearn에게 소품을 제공했습니다. 이것은 나를 위해 완벽하게 작동했습니다. – David