2010-11-05 16 views
7

Tôi muốn các tập lệnh PHP chạy cả trên dòng lệnh và trang web (tôi sử dụng Apache và Nginx) vì vậy tôi đặt #!/Usr/bin/php vào dòng đầu tiên của tập lệnh của tôi nhưng xuất hiện trên trang web ...Làm cách nào để tránh hiển thị "#!/Usr/bin/php" trên PHP?

+0

Nếu bạn đã sử dụng apache để phục vụ PHP, chỉ cần cấu hình nginx làm proxy ngược cho apache. – Qwerty

Trả lời

1

Gọi kịch bản bằng cách sử dụng lệnh php

+0

Làm thế nào có thể được thực hiện? Bạn có nghĩa là cho Nginx? Tôi sử dụng php-fpm trên debian – brainsqueezer

+0

Đúng là bạn có thể chạy tập lệnh bằng lệnh 'php'. Tuy nhiên, nếu bạn muốn tạo một tập lệnh thực thi ('chmod + x yourscript.php'), bạn cần phải thêm hashbang (#!) Vào dòng đầu tiên của tập lệnh. –

5

không cần phải có #!/usr/bin/php trong mã của bạn, chỉ cần chạy CLI kịch bản sử dụng php, ví dụ php /path/to/file.php hoặc /usr/bin/php /path/to/file.php.

+0

Nhưng nếu bạn muốn tạo một tập lệnh thực thi có thể chạy từ trình bao, bạn cần giải quyết vấn đề này. –

3

Tôi thường tìm thấy ý tưởng hay là tách logic khỏi bản trình bày. Khi tôi làm một cái gì đó như thế này, tôi đặt càng nhiều càng tốt trong một thư viện, và sau đó viết riêng biệt cli và giao diện web cho nó.

Điều đó nói rằng, gọi nó bằng lệnh php có lẽ là một sửa chữa dễ dàng hơn.

+1

+1 để tách logic. Điển hình là CLI và web sẽ yêu cầu các giao diện riêng biệt (tương tác với '$ argv' thay vì' $ _GET' chẳng hạn). Vì vậy, không có nhu cầu thực sự cho cùng một * tập tin * được gọi từ cả hai. – ircmaxell

17

Tôi đã giải quyết được sự cố khi sử dụng bộ đệm đầu ra. kịch bản của tôi bây giờ trông như thế này:

#!/usr/bin/php 
<?php 
@ob_end_clean(); 
... 

Lưu ý: Không có ?> vào cuối của tập tin. Đây thực sự là một thực hành tốt khi viết kịch bản PHP. Điều này ngăn chặn bất kỳ văn bản rác được in vô tình.

Lưu ý: Các tài liệu PHP cho ob_end_clean() nói rằng:

Bộ đệm đầu ra phải được bắt đầu bởi ob_start() với PHP_OUTPUT_HANDLER_CLEANABLE và cờ PHP_OUTPUT_HANDLER_REMOVABLE. Nếu không ob_end_clean() sẽ không hoạt động.

Dường như việc này được thực hiện tự động khi PHP chạy từ dòng lệnh.

+1

Giải pháp rất đẹp! Hoạt động, cảm ơn !!! – CDR

+1

Bạn có cần 'ob_start();' không? Có lẽ đáng nói đến. – Floris

+0

Tôi nghĩ bạn có thể đánh dấu câu trả lời này là đã chấp nhận (đã hơn 5 năm) :-) –

-1

Giải pháp đệm đầu ra ở trên là một bản hack. Đừng làm thế.

Điều đầu tiên, bạn đang thực sự tốt hơn bằng cách sử dụng lệnh env để xác định php đang được sử dụng:

#!/usr/bin/env php 

Sau đó cung cấp cho nó cho phép được thực hiện bởi chính nó:

chmod +x myfile 

Vì vậy, thay vì gọi 'php myfile', bây giờ bạn chỉ cần chạy:

./myfile 

Từ thư mục đó. Hi vọng điêu nay co ich!