2010-06-23 21 views
7

Mặc dù tính không thuận lợi của nó, việc sử dụng các lệnh shell của PHP để tương tác với các lệnh hệ thống non-php vẫn là một cách phổ biến để nhanh chóng đạt được các kết quả nhất định trong các ứng dụng web.Pattern for Wrapping Shell Commands trong một Class

Có ai trừu tượng hóa các trường hợp sử dụng phổ biến vào thư viện lớp học (một thứ gì đó trong Zend có thể không?) Cung cấp cách xử lý thông thường hơn? Mỗi lần tôi gặp phải (hoặc phải sản xuất ra) loại mã này là một loạt các spaghetti theo thủ tục, được sao chép lại nhiều lần. Tôi đã tự hỏi nếu (hy vọng rằng) cộng đồng PHP đã đưa ra một cách xử lý tốt hơn bằng cách sử dụng các ứng dụng dòng lệnh trong các ứng dụng web/php của bạn.

+0

Câu hỏi hay. [Ghi chú do người dùng đóng góp] (http://www.php.net/manual/en/function.exec.php) để exec() cung cấp nhiều cách tiếp cận, chủ yếu là chất lượng mà bạn mô tả mặc dù ... có rất nhiều hóa thân của các chức năng ở đó, một trong số đó thường sẽ hoạt động. Ngoài ra còn có một vài triển khai OOP sạch hơn, nhưng chúng phục vụ các trường hợp rất cụ thể (như bắt đầu và dừng các tiến trình trong Linux). Nó sẽ thực sự tốt đẹp để có thực hiện "hoàn hảo" cho việc này. –

+1

"Trường hợp sử dụng phổ biến" là gì? – Artefacto

+0

Vâng, nếu tôi có thể liệt kê tất cả những người và tự tin tôi biết họ, tôi có lẽ sẽ được thực hiện điều này bản thân mình thay vì hỏi nếu có ai đã thực hiện nó. Trong bất kỳ nhiệm vụ lập trình nào có vẻ đơn giản, có rất nhiều điều kiện chung mà bạn không nghĩ đến. Tất cả những gì tôi muốn nói là "các trường hợp sử dụng phổ biến" là tôi muốn giải pháp đã được nghĩ ra, và không phải là một lớp phương thức duy nhất kết thúc một cuộc gọi shell. –

Trả lời

3

Thực thi các ứng dụng dòng lệnh không có gì bẩn. Trong thực tế, đó là cách Unix. Và hầu hết hầu hết là lành mạnh hơn là cố gắng thực hiện lại, ví dụ: ImageMagick trong mã PHP thuần túy. (Do sự khác biệt của cmdline của nó args, imagemagick is a bad example trường hợp nếu bạn tìm kiếm một exec tốt đẹp() trừu tượng.)

Không có nhiều gói bạn có thể làm. Tốt nhất bạn có thể tóm tắt đầu vào/đầu ra cho hệ nhị phân bên ngoài của mình theo một phương thức:

function exec($args) { 
    $args = implode(" ", array_map("escapeshellcmd", func_get_args())); 
    $opts = $this->opts(); 
    return `{$this->bin} {$args} {$opts}`; 
} 

Vì vậy, bạn chỉ cần gọi -> exec ("- o", "$ file") khi cần. Mã của bạn chỉ có thể được gneralized hơn nữa với các hàm con chuyên dụng của exec, nếu ứng dụng cmdline cụ thể có một hệ thống vốn có trong lược đồ đặt tên --argument của nó.

Tùy thuộc vào trường hợp sử dụng thực tế của bạn, bạn có thể sử dụng một vài tùy chọn chuẩn. Tôi đã làm điều này cho pspell, nơi bạn có gần 1: 1 mối quan hệ của tên tùy chọn để --cmdline = args:

function opts() { 
    $map = array(
     "--ignore" => $this->ignore, 
     "--verbose" => $this->verbose, 
     "--dir={$this->dir}" => isset($this->dir), 
    ); 
    return implode(" ", array_keys(array_intersect($map, array(1=>1)))); 
} 

Một lớp trừu tượng rất chung cho exec/popen (đối với một loạt các chương trình cmdline) có lẽ không tồn tại.

+0

Tính không thường xuyên tôi đề cập thường đến 1. Tạo ra một quy trình mới là một hoạt động tốn kém và 2. Thường có một phần mở rộng PHP gốc sẽ xử lý mọi thứ cho bạn –

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