2009-07-13 7 views
8

Tôi có một tập lệnh PHP để kiểm tra một thư mục và xóa bất kỳ tệp nào không bị sửa đổi trong vòng 15 giây (Đó là trò chơi).Lặp lại Tập lệnh PHP

Vấn đề của tôi là làm thế nào để tập lệnh này chạy mọi lúc. Tôi thiết lập một công việc cron để chạy mỗi 10 phút và sau đó trong kịch bản PHP tôi có một vòng lặp vô hạn với một giấc ngủ (10). Suy nghĩ của tôi là nó sẽ chạy mã mỗi 10 giây, và trong trường hợp kịch bản dừng lại, công việc cron sẽ khởi động lại nó cuối cùng.

Tuy nhiên, sau khi tập lệnh được bắt đầu, nó chạy khoảng 3 vòng (30 giây) và sau đó dừng lại. Tôi đã nghe nói PHP chỉ nhận được rất nhiều bộ nhớ cho mỗi tải tập tin.

Làm cách nào để tạo vòng lặp tập lệnh PHP này vô thời hạn? Có thể có một số cách để tự gọi chính mình là

Trả lời

4

Bạn có thể chạy quy trình cha mẹ php để tìm kiếm khách hàng tại một khoảng thời gian. Nếu bạn tò mò về việc khám phá nó như là một lựa chọn ở đây là một điểm khởi đầu tốt: http://ca2.php.net/pcntl Điều tốt đẹp về việc làm theo cách này là quy trình gốc có thể giết các pids của khách hàng không kết thúc trong một khoảng thời gian hợp lý.

Nếu bạn đang tìm kiếm cái gì nhanh chóng và bẩn bạn có thể viết một kịch bản bash để gọi php khá dễ dàng (nếu bạn đang ở trên linux):

#!/bin/bash 
while [ "true" ]; do 
     /path/to/script.php 
     sleep 15 
done 

EDIT Bạn không thậm chí thực sự cần tập lệnh, bash sẽ làm tất cả trên một dòng:

while [ "true" ]; do /path/to/script.php; sleep 15; done 
+0

tôi –

+0

Tôi đang gặp khó khăn khi chạy tập lệnh bash để chạy qua cron. Có điều gì đặc biệt tôi cần phải đặt hay chỉ là thời gian và sau đó là đường dẫn đến tập lệnh? –

+0

Bạn không cần phải sử dụng cron, nó sẽ chạy không chính xác - nếu bạn sử dụng cron bạn sẽ kết thúc với rất nhiều quá trình làm điều tương tự.Chỉ cần chmod + x kịch bản bash và khởi động nó:/path/to /script.sh & – Eddy

2

Bạn có thể muốn kiểm tra tham số max_execution_time của mình trong tệp php.ini. Tôi tin rằng mặc định là 30 giây. Cách bạn thiết lập nó với cron, có thể bạn sẽ có nhiều phiên bản của tập lệnh chạy sau 10 phút trừ khi bạn thêm một số logic vào tập lệnh để kiểm tra xem bản sao của chính nó chưa được chạy

+0

Tôi đã kiểm tra điều đó. –

1

PHP là ngôn ngữ không giỏi chạy vô thời hạn. Vì bạn có cron-job cứ mười phút một lần, tại sao bạn không thực hiện nhiệm vụ 60 lần và sau đó thoát?

Ngoài ra, PHP có các tệp cấu hình khác nhau cho CLI và cho các chế độ apache trên hầu hết các máy chủ Linux. Vì vậy, có thể là khôn ngoan để kiểm tra của bạn etc/php/cli/php.ini và kiểm tra thời gian thực hiện tối đa và giới hạn bộ nhớ.

2

Đảm bảo tệp thực thi PHP của bạn được biên dịch để sử dụng làm trình thông dịch dòng lệnh, không phải là tệp thực thi CGI. PHP thường giết các tập lệnh chạy dài hơn max_execution_time (mặc định là 30 giây). Tuy nhiên, thực thi CLI không áp đặt giới hạn này.

More info about CLI vs. CGI SAPIs.

Bạn có thể kiểm tra SAPI của thực thi của bạn bằng cách sử dụng các --version luận:

$ php --version 
PHP 4.3.0 (cli), Copyright (c) 1997-2002 The PHP Group 
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies 
0

tất cả vì vậy thường xuyên (trước khi bạn chạy ra khỏi bộ nhớ) thoát ra khỏi vòng lặp và tái thực hiện tự exec ("/ usr/bin/php". FILE);

+0

Vấn đề với đó là tập lệnh mẹ chờ trả lại, điều này sẽ không bao giờ xảy ra. Sẽ làm việc này mặc dù:? exec ("/ usr/bin/php ./servercleaner.php>/dev/null 2> &1 &"); Hoặc sẽ vẫn giữ tạo kịch bản và không bao giờ nhận được đến cuối của bất kỳ –

0

Có một PEAR module để viết các tập lệnh PHP dài chạy. Tôi đã không sử dụng nó bản thân mình mặc dù.

+2

Liên kết bị hỏng. –

+0

Hoạt động OK cho tôi –