2009-08-13 41 views
7

Từ bên trong chương trình PHP, tôi muốn biết vị trí của tệp nhị phân đang thực thi nó. Perl có $^X cho mục đích này. Có một tương đương trong PHP?Làm cách nào để tìm hiểu tệp thực thi PHP hiện đang chạy?

Điều này là để nó có thể thực thi một tiến trình PHP con bằng chính nó (thay vì mã cứng một đường dẫn hoặc giả định "php" là chính xác).

CẬP NHẬT

  1. Tôi đang sử dụng lighttpd + FastCGI, không Apache + mod_php. Vì vậy, có, có một nhị phân PHP.
  2. eval/include không phải là giải pháp vì tôi đang sinh ra một máy chủ phải sống vượt quá yêu cầu.

Những điều tôi đã cố gắng và không có tác dụng:

  • $_SERVER['_'] trông giống như những gì tôi muốn từ dòng lệnh nhưng nó thực sự từ một biến môi trường được thiết lập bởi vỏ của người cuối cùng thực hiện chương trình. Khi chạy từ máy chủ web, đây là máy chủ web nhị phân.
  • which php sẽ không hoạt động do nhị phân PHP không được đảm bảo giống như trong máy chủ web PATH.

Xin cảm ơn trước.

Trả lời

14

Hằng số PHP_BINDIR cung cấp cho bạn thư mục nơi tệp nhị phân php là

+1

Điều gần nhất tôi đã nghe chưa, cảm ơn. – Schwern

+0

Tuy nhiên, một số người bỏ phiếu cho tôi xuống, có lẽ vì họ không kiểm tra nó :) Rất vui được giúp đỡ. – Lepidosteus

+1

Tôi sử dụng điều này trong bảng điều khiển iphp của mình. Đã đáng tin cậy đối với tôi. – apinstein

2

Vâng, $_SERVER['_'] là những gì bạn đang nói đến hoặc gần như tồn tại. Lý do bạn nhận được một máy chủ Web nhị phân khi nó chạy từ web là /usr/bin/php không có gì để làm với việc thực hiện của máy chủ Web; những gì nó đang chạy là một SAPI riêng biệt. Không có gì từ trang web PHP để trỏ đến /usr/bin/php vì không có lý do gì để ở đó.

+0

Không có lý do gì ... ngoại trừ câu hỏi được nêu trong câu hỏi của tôi. – Schwern

+0

@schwern: nhưng nếu thực thi là máy chủ web và php chỉ được sử dụng như một thư viện, tại sao sẽ có một lý do để trỏ đến một nhị phân php nếu nó không được sử dụng. Có một sự khác biệt với cách máy chủ web sử dụng perl vì trong hầu hết các trường hợp, giao diện là CGI và điều đó có nghĩa là chạy tệp thực thi perl (có ngoại lệ). Tôi muốn đặt cược tốt nhất của bạn là chuỗi cấu hình hoặc sử dụng eval() nếu điều đó đủ tốt cho nhu cầu của bạn. – Fredrik

+0

@Schwern: Nếu bạn xóa * '/ usr/bin/php', máy chủ Web của bạn sẽ tiếp tục xử lý các tệp PHP tốt. Tôi không biết làm thế nào để cho bạn biết lý do tại sao không có lý do * kỹ thuật * cho một mối liên hệ giữa họ rõ ràng hơn thế. – chaos

0

Tùy thuộc vào cách php được cài đặt mà bạn CANT tìm thấy tệp thực thi php. nếu php đang chạy như một mô-đun cho máy chủ web như mô-đun apache, thì không có nhị phân bạn có thể gọi. bạn có thể xem php_info() nó liệt kê mọi thứ. cũng có thể là đường dẫn đến php. trong đường dẫn đó, bạn có thể giả sử một nhị phân php.

nhưng tại sao bạn muốn gọi thêm một quy trình? bạn có thể thực thi các tệp php khác bằng cách bao gồm lệnh hoặc eval. không có lý do gì để sinh ra một quy trình mới.

+0

Có lẽ tôi muốn sinh ra một máy chủ? – Schwern

+0

+1 đơn giản chỉ vì tôi không thấy lý do cho điều này là -1 – Fredrik

-2

gì về: <?php exec("which php"); ?>

Tuy nhiên, nó là unix/linux chỉ: D

+1

Hoàn toàn không đảm bảo rằng nhị phân PHP chạy chương trình giống như nhị phân PHP trong đường dẫn của bạn. Trong tình huống của tôi, điều này rõ ràng không phải như vậy. – Schwern

1

Các PHP_BINDIR liên tục có lẽ là điều đơn giản nhất để sử dụng; điều tốt nhất tiếp theo tôi có thể đưa ra về cơ bản là tái tạo con đường bindir từ các thiết lập extension_dir cấu hình:

$phpbin = preg_replace("@/lib(64)?/.*[email protected]", "/bin/php", ini_get("extension_dir")); 

Nó có một regex trong nó, vì vậy nó cảm thấy giống như perl mẹ đẻ của mình nhưng mặt khác (!) không phải là đặc biệt tối ưu.

1

Trong PHP5.4 bạn có thể sử dụng PHP_BINARY liên tục, nó sẽ không làm việc qua mod_php hoặc tương tự nhưng sẽ qua CGI, vv

Đối với phiên bản trước của PHP readlink('/proc/self/exe'); có thể sẽ ổn thôi, một lần nữa nó sẽ không làm việc qua mod_php.

-1

Tôi đã tìm tệp thực thi php7 trên mac của mình (OSX El Capitan) để định cấu hình và cài đặt xdebug (cần thiết để tìm phiên bản phpize phù hợp để chạy). Không ai trong số các giải pháp tôi thấy làm việc cho tôi, vì vậy tôi chỉ kết thúc ra tìm kiếm nó:

find/-name php -print 

tôi biết (từ phpinfo()) mà tôi đã chạy php7, vì vậy tôi đã có thể suy ra các thư mục chính xác từ các tùy chọn được trình bày bằng cách tìm.

+0

Cảm ơn, nhưng điều này không trả lời được câu hỏi. Một chương trình không thể diễn giải danh sách như một người có thể. Con người chỉ đoán là cái đúng (một nguồn của nhiều giờ thất vọng). Và điều đó chỉ tìm kiếm các tệp có tên là "php", trình thông dịch thực tế đang chạy có thể được đặt tên là bất kỳ thứ gì. – Schwern

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