2011-01-23 35 views
8

Tôi đang tạo trang web php và tôi muốn có một tập lệnh (khi bạn nhấp vào nút) để thêm thông tin vào cơ sở dữ liệu mysql của tôi (tôi có thể làm điều này một phần của bản thân mình) và nó thực hiện một kịch bản 5 phút sau đó. Có lẽ nó không khó, nhưng thật khó để google công cụ như thế này, cảm ơn trước.PHP: thực thi kịch bản 5 phút sau khi tập lệnh đầu tiên chạy

+1

Mục đích của hành động di dời theo thời gian này là gì? Thông tin nào được thêm vào yêu cầu sự dịch chuyển này? – Gumbo

+1

Tôi đang tạo một trò chơi dựa trên trình duyệt và tôi muốn nó nếu ai đó muốn xây dựng một tòa nhà cần * phút và sau đó kết thúc. – Nyohosud

+0

nhận xét đó giúp ích rất nhiều với sự hiểu biết của chúng tôi về những gì bạn đang cố gắng đạt được và cách giúp bạn. Tôi đề nghị rằng rất nhiều câu trả lời đã đưa ra đang cố gắng đạt được điều gì đó khá khác biệt. – Spudley

Trả lời

-3

Bạn đang tìm kiếm điều đó?

sleep php.net

+0

'sleep' sẽ chặn; OP không đề cập đến nó một cách rõ ràng, nhưng nó có vẻ giống như một câu hỏi cho một giải pháp không chặn. – miku

+0

Không thực sự, tôi muốn nó thực thi một tập lệnh khác. VÍ DỤ. nút gọi process.php và process.php phải thực thi other.php 5 phút sau đó. – Nyohosud

+0

Một chút trí tưởng tượng ... Tất nhiên bạn không thể làm điều đó trong cùng một tập lệnh của trang web. Nhưng bạn có thể gọi từ scriptOfWebBrowser.php đến một tập lệnh actionAfter5Minutes.php khác trong máy chủ đang chạy nền với chức năng ngủ, do đó bạn không cần bất kỳ cron hoặc bất cứ điều gì và không phải là một vấn đề cho người dùng ... – raultm

6

Giấc ngủ là một ý tưởng rất tồi. Trình duyệt của khách hàng sẽ phải đợi 5 phút để hoàn thành yêu cầu !!!

Theo ý kiến ​​của tôi, bạn không thể làm như bạn muốn.

Bạn nên tạo tập lệnh khác truy vấn cơ sở dữ liệu và kiểm tra xem có dữ liệu mới không (và khi tìm nạp thành công thực hiện công việc). Kịch bản này nên được chạy bởi cron mỗi N phút.

4

Bạn có thể triển khai hàng đợi trong cơ sở dữ liệu, nơi bạn thêm "lệnh" để thực thi và cũng lưu khi thực hiện lệnh này. Sau đó, có một công việc cron chạy mỗi phút và kiểm tra hàng đợi để xem nếu đó là thời gian để thực hiện một lệnh nào đó.

5

Khá khó khăn. tôi muốn đi cho một cái gì đó như thế này:

  1. kịch bản ban đầu của bạn cho biết thêm một kỷ lục cho cơ sở dữ liệu, bao gồm thời gian của mình thực hiện,
  2. kịch bản khác có chứa các hành động mà cần phải được thực hiện 5 phút sau - nhưng khởi chạy nó chỉ khi bản ghi db được đề cập ở trên chứa dấu thời gian của ít nhất 5 phút trước (hy vọng đủ rõ ràng, tôi đang gặp rắc rối khi làm như vậy)
  3. đặt crontab để thực thi tập lệnh thứ hai sau mỗi X phút (có thể là 2).

Sẽ không chính xác 5 phút, nhưng thay vào đó là từ 5 đến 7 (trong trường hợp bạn chọn khởi chạy tập lệnh sau mỗi 2 phút). Điều đó sẽ làm gì?

+0

Điều này trông giống như một ý tưởng hay , nhưng làm thế nào tôi có thể tính toán nếu thời gian của 1 trong số các mục là 5 phút trước? – Nyohosud

+0

Trong tập lệnh đầu tiên, bạn đặt 'executiontime = NOW()' trong cơ sở dữ liệu. Trong lần thứ hai, bạn kiểm tra 'executiontime mingos

0

IMHO cách tốt nhất là: Trên nút bấm lưu công việc để chạy trong db với thời gian cần chạy. Viết một daemon nhỏ, lấy mỗi 10/5/2 giây các công việc mới cần được thực thi và thực thi chúng.

EDIT: Btw ý tưởng sử dụng cron để kiểm tra công việc mới để thực thi, tốt hơn, nhưng chỉ khi bạn có một trang web nhỏ và bạn không cần phải cân bằng tải cho công việc.

0

Cách tôi làm điều này là chạy một công việc cron giữa hai tập lệnh.

  1. tập lệnh đầu tiên đặt giá trị trong bảng cơ sở dữ liệu.
  2. công việc cron thực thi tập lệnh thứ hai. mỗi phút hoặc những gì không.
  3. tập lệnh thứ hai kiểm tra giá trị cơ sở dữ liệu được đặt bởi tập lệnh 1 để quyết định xem có chạy hoàn toàn hay không.
0

Bạn có thể chia rẽ quy trình và ở ngã ba trẻ em, ngủ trong 5 phút trước khi thực thi tập lệnh thứ hai. Tôi đã thử nghiệm này và nó xuất hiện quá trình con sẽ vẫn thực hiện ngay cả sau khi cha mẹ đã hoàn thành.Một cái gì đó như

//initial code 
$pid = pcntl_fork(); //fork the process 
if ($pid==0) // if in the child 
{ 
    exec("sleep 300; php second_process.php"); //sleep for 5 minutes and execute second script 
    return; // or exit 
} 
// rest of initial script... 

"Trả lại"; là quan trọng vì phần còn lại của tập lệnh sẽ thực thi lần thứ hai (ví dụ: trong trẻ em) trừ khi nó ở đó.

0

Tôi khuyên bạn nên làm bộ hẹn giờ trong Javascript thay vì PHP.

Đặt dấu thời gian trong $ _SESSION của người dùng để cho biết thời điểm họ bắt đầu sự kiện và sau đó gọi lại Javascript cho trình duyệt sau năm phút.

PHP vẫn cần biết thời gian bắt đầu (để ngăn người dùng hack trò chơi bằng cách tinh chỉnh thời gian chờ của Javascript), nhưng không cần phải thực hiện bất kỳ thời gian đếm ngược hoặc ngủ hoặc bất cứ thứ gì như chính nó.

3

Nếu bạn đang ở trên một hộp unix:

exec("echo 'php script.php' | at now +5 minutes"); 

Mà sẽ sắp xếp các php script.php lệnh để chạy sau 5 phút.

+0

Điều này khá khó sử dụng với rất nhiều người dùng. – ceejayoz

1

Tôi đang tạo trò chơi dựa trên trình duyệt và tôi muốn trò chơi đó nếu ai đó muốn xây dựng tòa nhà cần * phút và sau đó kết thúc.

Xem xét đây là mục tiêu thực tế của bạn, tôi khuyên bạn chỉ nên lưu tòa nhà ban đầu có dấu thời gian.

Tôi biết bạn đã gắn thẻ câu hỏi của mình bằng PHP, nhưng tôi không muốn bao gồm tất cả phí xử lý truy vấn mysql trong PHP, đặc biệt là vì tôi không biết cách bạn thực hiện các truy vấn hoặc khung công tác nào bạn ' tái khởi kiện, vì vậy đây là một số giả để xử lý này "các tòa nhà xây dựng" nhiệm vụ:

build.php

building_type_id = sanitize(POST['id']) 
user_id = current_user['id'] 

query('INSERT INTO buildings (user_id, building_type_id, created_at) 
     VALUES (' + user_id + ', ' + building_type_id + ', CURRENT_TIME)'); 

my_buildings.php

user_id = current_user['id'] 

completed_buildings = query('SELECT * FROM buildings b 
    LEFT OUTER JOIN building_types t ON b.building_type_id = t.id 
    WHERE DATE_ADD(b.created_at, INTERVAL t.construction_time SECOND) < NOW();') 
under_construction = query('SELECT * FROM buildings b 
    LEFT OUTER JOIN building_types t ON b.building_type_id = t.id 
    WHERE DATE_ADD(b.created_at, INTERVAL t.construction_time SECOND) > NOW();') 

Hy vọng điều này sẽ hữu ích!

+0

Đây là một đoạn mã tuyệt vời, chính xác những gì tôi đang cố gắng đạt được! thời gian tới tôi sẽ thêm điều tôi muốn đạt được trong bài đăng đầu tiên. Cảm ơn! – Nyohosud

+0

Nếu bạn thích, vui lòng đóng góp một phiếu bầu và/hoặc nhấp vào dấu kiểm ở bên trái của câu trả lời này để những người khác trong tương lai có thể dễ dàng tìm thấy nó hơn! –

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