2010-01-27 46 views
6

Tôi cần tạo một tập lệnh bằng ngôn ngữ PHP thực hiện hoán vị số. Nhưng PHP có giới hạn thời gian thực hiện được đặt là 60 giây. Làm thế nào tôi có thể chạy kịch bản để nếu bạn cần phải chạy hơn 60 sesunde, không bị gián đoạn bởi máy chủ. Tôi biết tôi có thể thay đổi giới hạn thời gian thực hiện tối đa trong php, nhưng tôi muốn nghe một phiên bản khác mà không cần phải biết trước thời gian thực thi của một tập lệnh.Tránh giới hạn thời gian thực thi PHP

Một người bạn đã đề xuất tôi đăng nhập và đăng xuất thường xuyên từ máy chủ, nhưng tôi không biết làm cách nào để thực hiện việc này.

Mọi lời khuyên đều được chào đón. Một mã ví dụ sẽ hữu ích.

Cảm ơn.

Trước tiên, tôi cần nhập số, cho phép nói 25. Sau khi tập lệnh được khởi chạy và cần thực hiện như sau: đối với mỗi số < = 25, nó sẽ tạo một tệp với số được tạo tại hiện tại sân khấu; cho số tiếp theo, nó sẽ mở tập tin đã tạo trước đó và sẽ tạo một cơ sở tệp khác trên các dòng của tệp đã mở và cứ thế. Bởi vì điều này mất nhiều thời gian, tôi cần phải tránh các kịch bản ong intrerupted bởi máy chủ.

Trả lời

2

@emanuel:

Tôi đoán khi bạn của bạn nói với bạn "Một người bạn đề nghị tôi để đăng nhập và đăng xuất thường xuyên từ máy chủ, nhưng tôi không có ý tưởng làm thế nào để làm điều này", ông/bà phải có nghĩa là "Chia tính toán tập lệnh của bạn thành x phần công việc và chạy nó một cách riêng biệt"

Ví dụ với tập lệnh này, bạn có thể chạy 150 lần để đạt được 150! (Factorising) và hiển thị kết quả:

// kịch bản và tên: calc.php

<?php 

session_start(); 

if(!isset($_SESSION['times'])){ 

    $_SESSION['times'] = 1; 

    $_SESSION['result'] = 0; 

}elseif($_SESSION['times'] < 150){ 

    $_SESSION['times']++; 

    $_SESSION['result'] = $_SESSION['result'] * $_SESSION['times']; 

    header('Location: calc.php'); 

}elseif($_SESSION['times'] == 150){ 

    echo "The Result is: " . $_SESSION['result']; 

    die(); 

} 

?> 

BTW (@Davmuz), bạn chỉ có thể sử dụng Hàm set_time_limit() trên các máy chủ Apache, nó không phải là một chức năng hợp lệ trên máy chủ Microsoft IIS.

+0

+1 Thats chủ yếu là việc thực hiện phía khách hàng của câu trả lời của tôi: đặt nó vào các bit và thực thi chúng từng cái một. Tuy nhiên, trong giải pháp này, nếu trình duyệt bị đóng, quá trình sẽ kết thúc. –

+1

@turik Như đã nhận xét bên dưới: '$ _SESSION ['result'] = 1;' trên dòng 5. –

0
set_time_limit(0) 
+0

Bạn có nhận ra anh ấy đặc biệt nói rằng anh ấy KHÔNG muốn điều này không? –

+0

Mặc dù điều này là exaclty những gì các câu hỏi yêu cầu, tôi nghĩ rằng nó sẽ là tốt hơn để ví dụ sử dụng set_time_limit (20) trong mỗi lần lặp của một vòng lặp. – svens

+0

@svens Trong khi OP đặc biệt nói rằng anh ta không muốn thay đổi thời hạn, tôi đồng ý rằng nó có lẽ sẽ là cách tốt nhất để làm điều đó. –

0

Bạn có thể cố gắng để đưa các cuộc gọi mà bạn muốn thực hiện trong một hàng đợi, mà bạn serialize vào một tập tin (hoặc bộ nhớ cache?) Khi một hoạt động được thực hiện. Sau đó, bạn có thể sử dụng một CRON-daemon để thực thi hàng đợi này sau mỗi 60 giây, vì vậy nó tiếp tục thực hiện công việc và hoàn thành nhiệm vụ.

Những hạn chế của phương pháp này là vấn đề với việc thêm vào hàng đợi, với khóa tệp và như vậy, và nếu bạn cần kết quả ngay lập tức, điều này có thể chứng minh phiền hà. Nếu bạn đang thêm công cụ vào một Db, nó có thể làm việc ra ngoài. Ngoài ra, nó không phải là rất hiệu quả.

0

Sử dụng Hàm set_time_limit (0) nhưng bạn phải vô hiệu hóa các safe_mode: http://php.net/manual/en/function.set-time-limit.php tôi đề nghị sử dụng một thời gian cố định (Hàm set_time_limit (300)) bởi vì nếu có một vấn đề trong các kịch bản (vòng lặp vô tận hoặc rò rỉ bộ nhớ) này không thể là một nguồn của vấn đề.

Máy chủ web, như Apache, cũng có giới hạn thời gian tối đa là 300 giây, vì vậy bạn phải thay đổi nó. Nếu bạn muốn làm một ứng dụng Comet, có thể tốt hơn nếu bạn chọn một máy chủ web khác với Apache có thể có thời gian yêu cầu dài.

Nếu bạn cần thời gian thực hiện dài cho thuật toán nặng, bạn cũng có thể thực hiện xử lý song song: http://www.google.com/#q=php+parallel+processing Hoặc lưu trữ dữ liệu đầu vào và máy tính bằng tập lệnh bên ngoài khác bằng cron hoặc bất kỳ thứ gì khác.

+0

Vui lòng chỉ định những gì bạn phải làm, các câu trả lời có thể chính xác hơn. – Davmuz

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