2010-04-22 56 views
19

Tôi đang cố gắng chạy một tập lệnh php theo lịch biểu. Vì vậy, tôi nghĩ crontab là một ý tưởng hay. Các máy chủ tôi đang sử dụng là trên Linux mà tôi không phải là quen thuộc với. Vì vậy, vấn đề tôi gặp phải là, tôi không biết làm thế nào làm cho tập lệnh thực thi được từ php. Tôi cần tham khảo kịch bản, hoặc đặt nó vào một thư mục có thể chạy php từ dòng lệnh. Vì vậy, tôi không biết những gì con đường để cung cấp cho crontab của tôi, ví dụ:Thực hiện php với crontab

5 * * * * var/www/some/path/script.php 

tôi tìm thấy một số thông tin mơ hồ về php thực thi này được tìm thấy trong

/usr/bin/php 

Nhưng tôi không thể tìm thấy bất kỳ php tập tin trong đó, có lẽ tôi không có nó được cài đặt? php5 và apache cài đặt của tôi là ở:

/etc/php5 

Vì vậy, câu hỏi của tôi sẽ trở thành, là có anyway để thực hiện một php-script với crontab trong bất kỳ thư mục khác, hoặc để tôi chỉ thiếu thực thi php trong usr/bin/php ?

+1

Stefan, phân phối Linux là gì? Bạn có cài đặt gói Apache/PHP "thông thường" không - hoặc bạn có sử dụng gói "Apachefriends" hoặc tương tự không? –

+0

Apache/PHP thông thường. My phpinfo(); cho biết Api Server: Apache 2.0 Handler. –

Trả lời

29

Bắt đầu bằng cách gõ vào một dòng lệnh:

whereis php

Làm điều này như là người dùng rằng công việc định kỳ sẽ được chạy theo. Điều này sẽ cho bạn thấy đường dẫn đến tệp thực thi của bạn. Sau đó bạn có thể sử dụng con đường đó (nếu nó không phải là đã có trong biến PATH của bạn) trong mục cron của bạn:

5 * * * * /your/path/to/php /var/www/some/path/script.php

Edit: bạn có thể cần phải cài đặt php5-cli (tên gói Ubuntu) gói nếu tất cả các bạn có là mô-đun PHP Apache được cài đặt. Điều này sẽ cung cấp cho bạn tệp thực thi nhị phân mà bạn có thể chạy từ một dòng lệnh.

+5

Bạn cũng có thể sử dụng 'php nào' trong dòng lệnh –

+0

whereis php đã cho tôi câu trả lời "php:" Không có nhiều thông tin. Tôi có thể phải xem xét việc cài đặt gói đó sau đó. Tôi đọc một cái gì đó về chạy crontab thông qua Lynx vì lý do nào đó nếu php của bạn đã được cài đặt trong chế độ Apache và không CGI. My phpinfo(); cho biết Server Api: Apache 2.0 Handler –

+1

Lấy lại "php:" theo cách riêng của nó có nghĩa là không thể tìm thấy file thực thi - vì vậy bạn có thể cần phải cài đặt gói để có được nó. – richsage

5

Đây có phải là hệ thống Linux không?

Trong bản phân phối Linux mới hơn, có
thực sự là một hệ thống crontab-setup thuận tiện
mà không yêu cầu bất kỳ mục trong crontab bởi người sử dụng. Ví dụ trong SuSE Linux, bạn có thư mục

/etc/cron.hourly/ 
/etc/cron.daily/ 
/etc/cron.monthly/ 
/etc/cron.weekly/ 

Chỉ cần đặt một kịch bản gọi (konno_php_start) trong bất kỳ các thư mục, như

/etc/cron.hourly/konno_php_start 

đó là thực thi (chmod 755 hoặc lâu hơn) và chứa:

#!/bin/sh 
cd /var/www/some/path/ 
php script.php >> logfile.txt 2>&1 

và khởi động lại trình nền cron. Đó là nó.

Từ tệp nhật ký, bạn sẽ thấy nếu thông dịch viên php của bạn
sẽ được tìm thấy trong PATH. Nếu không, hãy thay đổi dòng trong/etc/cron.giờ/konno_php_start để

/full/path/to/php script.php >> logfile.txt 2>&1 

Trân

RBO

+0

Làm cách nào để khởi động lại cron daemon? –

+0

SuSE: (như root) "rccron restart" Slackware giống như: /etc/init.d/cron restart những người khác: (google) –

+0

start-stop-daemon: cảnh báo: không thể giết 5097: Thao tác không được phép . ..Thất bại! là những gì tôi nhận được, nhưng hiện tại tôi không đăng nhập là người chủ. Tôi có cần phải root để chỉnh sửa crontab không. Xin lỗi nếu tôi hỏi những câu hỏi ngu ngốc, tôi là một chút mới cho toàn bộ điều máy chủ. –

2

Bạn cũng có thể sử dụng env, nó sẽ tìm và khởi động php cho bạn:

/usr/bin/env php /var/www/some/path/script.php 

Hoặc bạn có thể đặt một công việc trong script.php của bạn (dòng đầu tiên):

#!/usr/bin/env php 

sau đó làm cho nó thực thi, và làm cho crontab gọi nó là trực tiếp, như trong ví dụ đầu tiên của bạn:

5 * * * * /var/www/some/path/script.php 
+0

Tôi có viết điều này trong crontab không? –

+0

Có, thay vì lệnh ban đầu của bạn. –

0

tôi đề nghị bạn làm như thế này,

*/5 * * * * /path/gridmon2.pl 1> /dev/null 2> /dev/null 

nơi ở, bạn .pl đang bạn nên sử dụng wget grep hoặc một cái gì đó như thế này:

wget "/www/root/index.php" 

hoặc bạn chỉ có thể làm như thế này:

0.123.
/usr/bin/wget "/www/root/index.php" 

Đó chỉ là đề xuất của tôi, tôi chỉ thử truy cập trang web bên ngoài chứ không phải cục bộ và nó hoạt động.

hãy thử và hoàn nguyên.

+0

bạn cũng có thể sử dụng tệp .sh, cùng một thứ ... – Nazmin

+0

viết tắt của STDOUT là '>/dev/null 2> & 1' thay vì' 1>/dev/null 2>/dev/null' – vladkras

5

Tôi đã phải tìm đến theo một đường mòn để tìm ra thực thi:

[email protected]:~$ type php 
php is /usr/bin/php 

[email protected]:~$ file /usr/bin/php 
/usr/bin/php: symbolic link to `/etc/alternatives/php' 

[email protected]:~$ file /etc/alternatives/php 
/etc/alternatives/php: symbolic link to `/usr/bin/php5' 

[email protected]:~$ file /usr/bin/php5 
/usr/bin/php5: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped 

vì vậy bạn cần phải bao gồm/usr/bin/php5 như đường dẫn đến php thực thi như sau:

[email protected]:~$crontab -e 
#*/1 * * * * /usr/bin/php5 /home/andy/www/dev.com/corp_rewards_cron.php 
0

Bạn có thể sử dụng lệnh wget cục bộ:

5 * * * * wget http://localhost/some/path/script.php