2010-06-10 24 views
11

Sự khác nhau giữa việc thực thi php từ dòng lệnh và từ HTTP là gì? Họ có sử dụng cùng một tệp thực thi như (php.exe hoặc php-cgi.exe (Apache hoặc IIS)) không? Các kết quả khác nhau khi chúng đang thực thi từ dòng lệnh hoặc HTTP?Sự khác nhau giữa việc thực hiện php từ dòng lệnh và từ bên Http

+0

Điều này nghe giống như bài tập về nhà hoặc câu hỏi kiểm tra đối với tôi. Không phải đó là xấu hay gì cả. – Nathan

+0

Bạn thực sự nên đọc hướng dẫn sử dụng (http://www.php.net/manual/en/features.commandline.php). Nó sẽ cho bạn biết sự khác biệt và các tính năng tiền thưởng, chẳng hạn như trình bao tương tác, thực thi các tệp tập lệnh, v.v. –

Trả lời

2

Cho dù PHP được gọi thông qua một mô-đun máy chủ web hoặc CLI, cơ sở nhị phân giống nhau được sử dụng (nhưng đôi khi có thể được cấu hình để sử dụng các ini khác nhau có thể ảnh hưởng đến tập lệnh). Đó là môi trường cũng sẽ khác nhau nên các biến môi trường sẽ không chính xác.

PHP cũng biết rằng nó được gọi khác nhau và sẽ điều chỉnh đầu ra cho phù hợp (ví dụ: phpinfo(); đầu ra sẽ được định dạng khác khi được gọi qua CLI).

+0

Hoặc chúng sử dụng một nhị phân khác. Hầu hết các triển khai tôi đã xem qua đã có một phiên bản hoàn toàn khác cho mô-đun cli & apache, đôi khi không phải là cùng một phiên bản .... – Wrikken

+0

@Wrikken. Điều đó phải được thực hiện một cách có mục đích bởi quản trị viên vì một lý do nào đó. Dù bằng cách nào, bây giờ tôi đã gọi nó là 'cơ số nhị phân' – webbiedave

1

Khi bạn đang thực hiện php từ dòng lệnh apache máy chủ của bạn hoặc iis không có vai trò để chơi. Bạn chỉ cần sử dụng php4 hoặc thư mục php5 để thực thi mã của bạn. Có thể có sự khác biệt với việc thực hiện theo sự khác biệt trong các thư viện có sẵn và cài đặt php.ini trong hai thư mục. Khi chạy từ apache php.ini trong apache/bin của bạn được sử dụng. Khi từ dòng lệnh php.ini từ thư mục php5 hoặc php4 của bạn được sử dụng.

2

Sự khác biệt chính là đối số đi qua: chạy từ CLI, bạn không có $ _GET, $ _POST, $ _SESSION, v.v ...; do đó các đối số phải được chuyển thành tham số dòng lệnh và được truy cập bằng cách sử dụng nếu $ _SERVER ['argc'] và $ _SERVER ['argv'] Xem thư mục của bạn đang chạy và đường dẫn bao gồm; và chắc chắn rằng bạn biết những gì php.ini bạn đã tải. Khi xuất, đánh dấu HTML không hiển thị dưới dạng đánh dấu, nhưng hiển thị là < h1> vv .... xem ra đặc biệt cho
(PHP_EOL cực kỳ hữu ích) và nhiều dấu cách hoặc tab thực sự xuất hiện dưới dạng nhiều không gian hoặc tab rathe rthan a không gian duy nhất. Quên tiêu đề() và các chức năng cụ thể khác của http

1

Khác với những gì đã nói, có thể có sự khác biệt về đặc quyền đối với những phần nào của hệ thống tệp có thể truy cập được: PHP qua máy chủ web chạy với tư cách người dùng máy chủ web, PHP dòng lệnh được chạy như chính bạn.

6

Không đánh dấu html trong lỗi
Đây là một thiết lập php.ini (html_errors), nhưng giá trị mặc định này để tắt trong phiên bản cli.

Logging để thiết bị lỗi chuẩn
Thông thường lỗi đăng nhập vào máy chủ web error.log, nhưng trong cli lỗi phiên bản được ghi vào stderr.
này cũng có sẵn như là một khung cảnh php.ini (error_log)

php.ini
Các tập tin php.ini được sử dụng cho các phiên bản cli có thể là một tập tin khác nhau. Mà có thể dẫn đến một số lỗi khó chịu (curl đột nhiên không có sẵn, vv).

thực thi khác nhau
Có thể cài đặt nhiều phiên bản của php (php5 cùng php4)
Sử dụng which php để xác định phiên bản bạn đang sử dụng.

Tất cả mọi thứ được hiển thị dưới dạng văn bản
var_dump() là có thể đọc được mà không có một <pre>
Không chênh lệch giữa header('Hello');echo('Hello');

0

Mặc dù câu hỏi này là rất cũ, tôi muốn mở rộng @ Bob Fanger của một chút.

Chạy file php từ dòng lệnh là khá tầm thường, bạn chỉ cần ghi nhớ rằng có một số khác biệt so với chạy các tập tin trên máy chủ web hoặc trên một giao diện máy chủ dòng lệnh:

  • không Cookies sẵn

  • không $_GET, $_POST, $_SESSION sẵn Nhưng bạn có thể sử dụng để có được các thông số thông qua như là một đối số cho lệnh. Giá trị đầu tiên là allways tên tập tin.

    Ví dụ lấy tập tin này:

    <?php 
    var_dump($argv); 
    ?> 
    

    gọi là như thế này:

    [email protected]:$ /usr/bin/php /home/user/file.php foo bar 
    

    sẽ cung cấp cho bạn kết quả này:

    array(4) { 
        [0]=> 
        string(8) "file.php" 
        [1]=> 
        string(3) "foo" 
        [2]=> 
        string(3) "bar" 
    } 
    
  • đường dẫn tập tin đầy đủ từ gốc máy chủ của bạn yêu cầu Bạn sẽ cần cung cấp đường dẫn đầy đủ cho tệp của mình (ví dụ: fo r include(), require(), file_get_contents(), ...), mặc dù chúng có thể nằm trong cùng một thư mục.

  • cài đặt người dùng/quyền khác nhau các tệp không được thực thi bởi người dùng www-data nhưng do người dùng bạn đã đăng nhập vào máy của mình. Điều này ảnh hưởng đến tất cả các cuộc gọi hàm của tệp của bạn ảnh hưởng đến hệ thống tệp của máy, (ví dụ: mkdir(), include(), ...) để bạn phải đảm bảo cấp quyền thích hợp cho người dùng đó.

+1

Thêm vào phần bổ trợ hữu ích này, các biến '$ _SERVER' cũng không có sẵn cho tập lệnh trong CLI, chẳng hạn như' $ _SERVER ['DOCUMENT_ROOT'] 'cho truy cập bao gồm trên một kịch bản. – Martin

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