2010-08-30 33 views
8

Tôi có một tập lệnh php xử lý đầu vào biểu mẫu. Vì lý do thiết kế, cả một chút ngoài tầm kiểm soát của tôi và tôi không muốn thay đổi hoàn toàn, tôi phải gọi một kịch bản perl với các tham số được chỉ định trong biểu mẫu html.Gọi perl từ php?

Tôi đã khử trùng tất cả các yếu tố đầu vào rồi xuất chúng ra tệp được gọi là đầu vào, được đọc bởi tập lệnh perl có tên, vì lợi ích ngắn gọn trong câu hỏi này, script.pl. Script.pl nên làm một số công cụ và sau đó viết tất cả các kết quả đầu ra vào một tập tin có tên đầu ra.

tôi gọi là kịch bản perl từ php như vậy:

system('perl script.pl 2>errors'); 

Không tốt, không có gì xảy ra. đầu ra không được tạo ra, lỗi không được tạo ra, và tác dụng phụ không xảy ra.

Apache của tôi chạy dưới dạng id người dùng và id nhóm www. Thư mục của tôi được đặt với 775 cài đặt có quyền sở hữu như tôi: www-data. (Tên người dùng của tôi được thay thế bằng "tôi" để tìm kiếm quyền riêng tư).

Câu hỏi của tôi là hai lần: 1) Tôi có làm điều này sai không? Nếu vậy làm thế nào tôi nên cải thiện khi mã? 2) Có cách nào tốt hơn để bắt lỗi trong quá trình thực thi hệ thống không?

Sau khi lập trình trong perl trong một thời gian, php cảm thấy giống như một nỗi đau trong ass.

Hệ điều hành: Phiên bản máy chủ Ubuntu

+2

Đối với mục đích thử nghiệm: Bạn có nhận được bất kỳ đầu ra với 'passthru ('script.pl perl 2> &1');' – VolkerK

+0

passthru() làm mọi thứ như dự định gì đang xảy ra ??? –

+0

đọc:?. Http://php.net/manual/en/function.passthru.php –

Trả lời

1

popen có thể được sử dụng để nhận phản hồi của trình bao. đó là đặt cược tốt nhất của bạn. Mà có thể giúp bạn gỡ lỗi tại sao hệ thống là tức giận. Ngoài ra, nếu pl của bạn đang nói "hello" và "bye", popen thậm chí có thể đọc được.

Nếu không thể thực hiện lệnh, tài nguyên hợp lệ được trả về. Điều này có vẻ kỳ lạ, nhưng có ý nghĩa; nó cho phép bạn truy cập vào bất kỳ thông báo lỗi nào được trả về bởi shell

Lý tưởng nhất, tôi đã lấy dữ liệu từ stdin và được viết thành stdout. popen sẽ cho phép truy cập gọn gàng vào cả hai.

popen('pwd;perl script.pl 2>errors;echo done');

sau đó bạn có thể thấy anh đã ở đâu (thư mục) khi hệ thống đã kêu gọi và đã làm nó "thực hiện".

+0

Dọc theo cùng một dòng, gần đây tôi đã phát hiện ra rằng 'proc_open' là awesomely mạnh mẽ khi chạy các quá trình khác thông qua php, và nó không phải là khó sử dụng như nó có thể nhìn vào đầu tiên. – grossvogel

0

Là perl trong đường dẫn? Có thể bạn cần chỉ định nó đầy đủ (ví dụ:/usr/bin/perl). Hệ thống() trả về sai, có biểu thị sự thất bại không? Nếu bạn thử một cái gì đó đơn giản hơn, chẳng hạn như system('/usr/bin/true', $retval), thì $retval có được đặt thành 1 không?

+0

đường dẫn perl được thiết lập, chạy lệnh thủ công trên các thiết bị đầu cuối hoạt động. Tuy nhiên, tôi chỉ cần đặt trong một kiểm tra, và hệ thống gọi là trở về sai. –

+0

Có lẽ lệnh perl nằm trong đường dẫn cho đăng nhập/vỏ tương tác của bạn nhưng không phải cho quy trình máy chủ web? – VolkerK

+0

Tôi đã xác định đường dẫn tuyệt đối và nó vẫn trả về false, có cách nào để kiểm tra lỗi của hệ thống() không? –

0

Hãy xem PHP system() documentation. Sau đây là nguyên mẫu chức năng của hệ thống():

string system (string $command [, int &$return_var ]) 

Chuyển đối số thứ 2 rồi in chuỗi trả về cũng như biến thứ hai. Xem những gì lỗi nói.

1

Trong quá khứ tôi đã sử dụng shell_exec() hoặc backticks để thực hiện việc này.

Các tài liệu cho giá trị trả về shell_exec của chỉ ra nó giống như các nhà điều hành backtick:

Return Values ​​

Kết quả của lệnh thực thi.

Hy vọng điều đó sẽ hữu ích.

hệ thống() chỉ trả lại mã trạng thái.

$var = shell_exec ("ls"); 
print $var; 
$var = `ls -l`; 
print $var; 
Các vấn đề liên quan