2009-07-10 48 views
13

Tôi đang cố gắng làm chính xác điều tương tự như trong câu hỏi Python trước đây của tôi, nhưng trong PHP. See my previous (answered) questionLàm thế nào để làm cho tập lệnh php chạy một tập lệnh php khác

Tập lệnh PHP từ câu hỏi trước sẽ làm điều gì đó và sau đó chạy một tập lệnh PHP khác trên cùng một máy chủ, thực hiện điều gì đó và sau đó thoát (trong khi tập lệnh thứ hai vẫn tiếp tục hoạt động). Làm thế nào để đạt được điều này? Xin lưu ý rằng PHP script cũng là một trang web cùng một lúc (vì vậy có lẽ chúng ta có thể sử dụng nó như trong câu hỏi trước đó, nơi câu trả lời cho câu hỏi của tôi là đoạn mã đã làm cho python chỉ url mở thay vì chạy tiến trình con. Mặc dù tôi không có đầu mối nếu đó là thông tin hữu ích, có thể nó khác trong PHP, tôi không quá kinh nghiệm trong PHP) ... và tôi muốn làm cho mỗi tập lệnh độc lập - vì vậy nếu tập lệnh php đầu tiên kết thúc Tôi muốn tập lệnh php thứ hai tiếp tục hoạt động ngay cả khi tập lệnh đầu tiên đã kết thúc.

Bạn nghĩ cách nào là thanh lịch nhất để làm điều này? Sẽ lặp lại iframe làm việc hoặc tôi nên làm điều này một cách khác nhau?

Trả lời

2

Nếu người dùng sẽ sử dụng trình duyệt web để truy cập tập lệnh php, tôi sẽ sử dụng ajax để gọi trang thứ hai.

Người dùng thậm chí sẽ không biết nó đang được gọi.

Xem w3schools cho một hướng dẫn về AJAX

+17

Bỏ phiếu xuống để gửi áp phích gốc tới W3Schools. Xem: http://w3fools.com/ –

+4

Stackoverflow cần tự động thay thế cho w3schoolds với MDN. https://developer.mozilla.org/en/docs/AJAX –

+0

Xấu vì về cơ bản chỉ là một câu trả lời liên kết, và không có giải thích về cách sử dụng ajax từ tập lệnh php để gọi một tập lệnh php khác – Andrew

2

Nếu bạn cần kịch bản này khác để được chạy, tùy thuộc vào khách hàng sẽ không phải là khôn ngoan.

Điều tôi muốn làm là sử dụng kỹ thuật được mô tả trong câu trả lời cho this StackOverflow question (trỏ đến this comment in the PHP documentation) và bao gồm tập lệnh khác làm xử lý sau của bạn.

Tuy nhiên, nhận xét đó được viết vào năm 2006 và mọi thứ có thể đã thay đổi kể từ đó. Vui lòng thử kỹ thuật (như tôi sẽ làm, chỉ để giải trí) và xem nó có hiệu quả với bạn không :)

1

Theo hiểu biết tốt nhất của tôi, không có cách nào để chạy trang thứ hai (AJAX là ngoại lệ). Theo tôi biết, PHP không hỗ trợ nhiều chủ đề (hãy sửa tôi nếu tôi sai) và bản chất 'đơn luồng' của web dường như đánh bại nó.

Tôi thà có khuynh hướng xem ứng dụng cụ thể của bạn và tìm hiểu lý do tại sao bạn cần phải có hai trang riêng biệt chạy - và sau đó tái thiết kế lại quy trình để nó không hoạt động.

Tôi sẵn sàng đặt cược rằng một kỹ sư lại sẽ kết thúc ít bị đau đầu hơn từ quan điểm phát triển, cũng như logic và triển khai thực hiện.

16

Đây là một chút của unix/linux-chỉ hack mà có thể không hoạt động trên các máy chủ web chia sẻ:

file1.php

<?php 
$somearg = escapeshellarg('blah'); 
exec("php file2.php $somearg > /dev/null &"); 

file2.php

<?php 
//do some stuff that will take a while 
//$argv should contain 'blah', and also it seems the name of the php file 
//this script will continue to run. You might want to set max_execution_time to a sensible value. 
1

Bạn nên xem xét pcntl_fork nếu bạn muốn một ứng dụng đa luồng. Ngoài ra, hãy xem ignore_user_abort.

+0

Phương pháp đó có hoạt động trên Apache không? Nhận xét này về tài liệu (http://us2.php.net/manual/en/function.pcntl-fork.php#49949) nói không, nhưng những người khác nói kinda. – Matchu

+0

Ngoài ra, ignore_user_abort chỉ liên quan đến việc người dùng nhấn dừng, không phải bản thân tập lệnh đóng kết nối sớm. – Matchu

+0

Không, pcntl_fork sẽ không hoạt động theo mod_php. OP không chỉ định nếu tập lệnh sẽ được sử dụng cho web hoặc cli. – shadowhand

0

Tôi gặp sự cố khi nhận câu trả lời trước, mặc dù tôi nghi ngờ đó có thể là lỗi của máy chủ của riêng tôi hoặc có thể trình duyệt mới từ chối kết nối khi được hướng dẫn (Tôi thực sự không phải là chuyên gia về cách thức mà shtuff hoạt động).

Nếu phương pháp mà không làm việc cho bạn, hoặc, hãy thử this article on pseudo-multi-threading in PHP, và xem nếu bạn có may mắn hơn :)

4

Bạn có thể làm điều đó bằng cách đặt header('Location: second.php'); vào cuối first.php và một lần nữa ở cuối tệp second.php để bắt đầu thực hiện tệp third.php và v.v. Thậm chí bạn có thể tạo chu kỳ giữa hai tập lệnh, tức là sau khi kết thúc first.php, second.php sẽ được bắt đầu và sau khi thực thi second.php một lần nữa tệp first.php, một lần nữa second.php và vân vân. Nhưng hãy nhớ rằng, đây là một tính năng phụ thuộc trình duyệt và có bao nhiêu kịch bản có thể được thực hiện cái khác, hoàn toàn phụ thuộc vào bao nhiêu lần trình duyệt cho phép chuyển hướng. Tôi tìm thấy mozilla cho phép 23 chuyển hướng, điều đó có nghĩa là bạn có thể thực hiện 23 tập lệnh cái khác.

3

Để chạy một kịch bản thứ hai trên cùng một máy chủ

$appUrl = $_SERVER['HTTP_HOST']; 
$path = 'second.php';//your path here 
$appUrl = 'http://'.$appUrl.'/'.$path; 
file_get_contents($appUrl); 
+1

file_get_contents chỉ nhận được nội dung của nó, phải không? Làm thế nào để nó giúp thực thi tập tin? Đúng nếu tôi sai, xin lỗi, đang học. –

+0

Vâng - tôi đồng ý .. file_get_contents vừa nhận cho tôi văn bản của tệp .. nó không thực thi nó – jcansell

+0

bạn nhận được nội dung của trang web có nghĩa là nó được thực hiện, – user889030

0

Nếu kịch bản điều khiển từ xa có thể truy cập như trang web đơn giản thông qua http, bạn có thể thử biến thể bằng http get yêu cầu nơi thời gian chờ phản ứng thiết lập để thời gian tối thiểu ví dụ qua CURL:

if($curl = curl_init()) { 
    curl_setopt($curl, CURLOPT_URL, 'http://your_site/your_script.php'); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 1); 
    curl_exec($curl);  
    curl_close($curl); 
} 

nhưng vì vậy bạn sẽ bị trì hoãn trong 1 giây trong lần thực thi tập lệnh đầu tiên của mình.

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