2012-02-03 40 views
17

Tôi muốn chạy một công việc định kỳ. Ứng dụng của tôi được phát triển bằng PHP và Mysql.

Trong trình duyệt nếu tôi sử dụng $_SERVER[HTTP_HOST] trong mã hóa, nó hoạt động tốt. Nhưng nếu tôi sử dụng cùng một điều trong công việc cron nó là đưa ra lỗi.

Mọi người có thể đưa ra đề xuất sửa lỗi này không?

+0

vui lòng cung cấp một số lỗi thông điệp của một số loại. Có thể $ _SERVER ['HTTP_HOST'] không xác định do tập lệnh cron không định nghĩa bất kỳ HTTP_HOST nào, giống như trình duyệt? Bạn có thể kiểm tra nó với isset ($ _ SERVER ['HTTP_HOST']) –

+0

php> = 5.3.0 sử dụng gethostname() – nick

Trả lời

16

$_SERVER['HTTP_HOST'] không được điền khi chạy từ cronjob, tệp không được truy cập qua HTTP.

Bạn sẽ phải mã hóa Máy chủ hoặc chuyển nó qua đối số dòng lệnh và truy cập thông qua mảng $_SERVER['argv'].

+0

Câu trả lời hay. Kịch bản lệnh CLI có $ argv và $ argc globals mà bạn có thể truy cập, do đó không cần sử dụng $ _SERVER. –

+1

'$ argv' không có sẵn trong các hàm không có từ khóa chung. '$ _SERVER' là superglobal. – TimWolla

2

Bạn có thể mã hóa cứng giá trị $_SERVER[HTTP_HOST] nếu nó trống hoặc bạn có thể thực hiện một số kiểm tra khác.

6

Khi php được thực hiện trên dòng lệnh, $_SERVER['HTTP_HOST'] là (tất nhiên) không khả dụng.

Bạn chỉ có thể ngăn chặn các lỗi bằng cách sử dụng dấu @ hoặc là một chút thận trọng hơn sử dụng một dòng xây dựng:

$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'CLI'; 
6

Như đã trình bày ở trên, $ _SERVER là không có mặt khi bạn chạy php qua php-cli.

Mặc dù, có một tùy chọn để chạy tập lệnh cron'd của bạn trong php-cgi, nơi bạn sẽ có $ _SERVER. Nếu bạn cuộn tròn đến máy chủ web cục bộ thì $ _SERVER sẽ được điền.

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

Tuy nhiên, tôi nghĩ rằng bạn thực sự nên gắn bó với các giải pháp được đề xuất bởi TimWolla hoặc DerVO, trừ khi bạn thực sự cần phải hành vi này.

Ưu điểm:

  • Bạn sẽ nhận được tất cả các biến $ _SERVER thiết lập như mong đợi.
  • Nếu bạn cần phải viết lại rất nhiều mã với if-else của điều này có thể được ưa thích vì bạn không cần phải thay đổi bất kỳ mã nào.

Nhược điểm:

  • Nó là loại một cách giải quyết và có lẽ có nghĩa là tăng nhẹ tải CPU.
4

Thử chạy cron job với curl .. Nó sẽ điền $ _SERVER ['HTTP_HOST'] của bạn.

cú pháp trên Linux cũng giống như

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

Đây là giải pháp đơn giản nhất trong tâm trí của tôi, miễn là tệp của bạn nằm ở URL công khai. AronCederholm cũng đưa ra một gợi ý tương tự nhưng đạo cụ cho @alwaysLearn để trả lời đúng cho vấn đề. Điều này làm việc hoàn hảo cho tôi. – David

Các vấn đề liên quan