2012-06-21 27 views
5
<?php 
while(true){ 
//code goes here..... 
} 
    ?> 

Tôi sẽ tạo một máy chủ web PHP, vì vậy tập lệnh này có chạy vĩnh viễn với Curl không?có thể tạo một tập lệnh php để chạy mãi mãi với Cron Job?

+1

những gì bạn cần là 'while (true)', và có nó sẽ tiếp tục chạy mãi mãi cho đến khi điều gì đó xảy ra (tốt hơn là do điều kiện phá vỡ bạn chỉ định) – Adi

+0

@AdnanShammout nó sẽ tự động chấm dứt sau một thời gian. PHP có thời gian thực thi tối đa được cài đặt sẵn, trừ khi bạn sửa đổi cài đặt đó trong mã của mình. –

+0

@DexterHuinda, giới hạn thực thi PHP chỉ áp dụng khi chạy từ trình duyệt web. Khi chạy như một lệnh 'php server.php' giới hạn không áp dụng. Tại sao bất cứ ai muốn chạy một máy chủ mãi mãi từ một trình duyệt web? – Adi

Trả lời

15

Đừng quên đặt thời gian thực hiện tối đa thành vô hạn (0).

Better chắc chắn rằng bạn không chạy nhiều hơn một ví dụ, nếu đó là ý định của bạn:

ignore_user_abort(true);//if caller closes the connection (if initiating with cURL from another PHP, this allows you to end the calling PHP script without ending this one) 
set_time_limit(0); 

$hLock=fopen(__FILE__.".lock", "w+"); 
if(!flock($hLock, LOCK_EX | LOCK_NB)) 
    die("Already running. Exiting..."); 

while(true) 
{ 

    //avoid CPU exhaustion, adjust as necessary 
    usleep(2000);//0.002 seconds 
} 

flock($hLock, LOCK_UN); 
fclose($hLock); 
unlink(__FILE__.".lock"); 

Nếu trong chế độ CLI, chỉ cần chạy tập tin.

Nếu trong một PHP trên một máy chủ web, bạn có thể bắt đầu một mà phải chạy infinetely như thế này (thay vì sử dụng cURL, điều này loại bỏ sự phụ thuộc):

$cx=stream_context_create(
    array(
     "http"=>array(
      "timeout" => 1, //at least PHP 5.2.1 
      "ignore_errors" => true 
     ) 
    ) 
); 
@file_get_contents("http://localhost/infinite_loop.php", false, $cx); 

Hoặc bạn có thể bắt đầu từ cron Linux sử dụng wget như thế này:

`* * * * * wget -O - http://localhost/infinite_loop.php` 

Hoặc bạn có thể bắt đầu từ Windows Scheduler sử dụng bitsadmin chạy một tập tin .bat chứa này:

bitsadmin /create infiniteloop 
bitsadmin /addfile infiniteloop http://localhost/infinite_loop.php 
bitsadmin /resume infiniteloop 
+1

kỹ thuật khóa tốt bằng cách sử dụng tay cầm tập tin, ngón tay cái lên! –

+0

Upvotes up! ... –

+0

đã thêm ignore_user_abort để đảm bảo tập lệnh không kết thúc vì người gọi đã từ chối yêu cầu, khi ở trong môi trường web. –

0

Theo mặc định, không vì PHP có giới hạn thời gian thực thi. Xem: http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

Bạn có thể làm cho ứng dụng chạy mãi mãi bằng cách đặt giá trị hoặc gọi set_time_limit trong tập lệnh của bạn (http://php.net/manual/en/function.set-time-limit.php).

Nhưng tôi không khuyên bạn nên điều này vì PHP (được gọi bằng yêu cầu HTTP) không được thiết kế để có vòng lặp vô hạn. Sử dụng tập lệnh cục bộ thay vào đó nếu bạn có thể, hoặc yêu cầu trang trong các khoảng thời gian để thực hiện tác vụ thường xuyên.

Nếu trang web của bạn được duyệt bởi người khác thường xuyên, bạn có thể thực hiện việc này trong mọi trang thay thế.

(Và hãy tưởng tượng nếu ai đó yêu cầu kịch bản nhiều hơn một lần, bạn sẽ có nhiều thể hiện của nó chạy)

+0

Điều này chỉ áp dụng khi chạy từ trình duyệt web – Adi

+0

@AdnanShammout Ông tuyên bố 'curl' để đoán tốt nhất sẽ chạy từ yêu cầu HTTP –

+0

Bạn có thể hướng dẫn tôi qua quy trình suy luận đó không? Tôi không thấy làm thế nào 'curl' sẽ chỉ ra chạy từ một trình duyệt web. – Adi

0

Bạn có thể làm cho nó xảy ra chỉ khi bạn thiết lập set_time_limit (0) trong kịch bản của bạn, ngược lại nó sẽ ngừng thực thi sau khi max_execution_time đặt trong cấu hình.

Và bạn đang sử dụng trong khi (đúng) điều kiện, điều đó sẽ làm cho tập lệnh của bạn chạy luôn.

1

Đối với một mã php để chạy mãi mãi, nó cần phải có ff .:

  • set_time_limit(0); // nên php sẽ không chấm dứt như bình thường, nếu bạn sẽ làm những thứ mà sẽ mất một chế biến rất dài Hiện
  • handler cho duy trì trang web hoạt động [thường bằng cách thiết lập một kịch bản phía máy khách để gọi cùng một trang trong khoảng thời gian] Xem setInterval(), setTimeout()

EDIT: Nhưng kể từ khi bạn sẽ sett ing lên một công việc cron sau đó bạn có thể tránh xa việc xử lý phía khách hàng.

CHỈNH SỬA: Đề xuất của tôi, không sử dụng vòng lặp vô hạn trừ khi bạn có mã yêu cầu nó thoát khỏi vòng lặp sau một thời gian. Hãy nhớ rằng, bạn sẽ được gọi cùng một trang bằng cách sử dụng một công việc cron, do đó, không có điểm trong việc giữ vòng lặp vô hạn. [sửa] Nếu không, bạn sẽ cần một hệ thống khóa như đề xuất bởi @ Tiberiu-Ionuț Stan vì vậy chỉ có 1 thể hiện có thể chạy mỗi khi cron job được gọi.

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