15

Tôi cần chạy tập lệnh PHP từ dòng lệnh và tôi cần đặt một số biến môi trường. Rất tiếc, tính năng sau không hoạt động:Đặt biến môi trường PHP trong khi chạy tập lệnh dòng lệnh

php -dAPPLICATION_ENV=staging script.php 

Điều tôi muốn hoàn thành là có bộ biến số APPLICATION_ENV.

+0

là không gian giữa -d và APPLICATION_ENV một lỗi đánh máy ? Thử đặt putenv ("APPLICATION_ENV = dàn dựng"); trong script.php – Tdelang

+0

Bạn có cần thiết lập một số biến từ bên trong tập lệnh hay truy cập biến môi trường từ bên trong tập lệnh không? Nếu sau này, bạn đang sử dụng mã nào để truy cập nó? – DaveRandom

+0

Trong biến tập lệnh được truy xuất bằng hàm 'getenv()'. – Wiktor

Trả lời

21
APPLICATION_ENV=staging php script.php 

Biến sẽ có mặt trong mảng $ _SERVER:

echo $_SERVER['APPLICATION_ENV']; 
5

Khi bạn thực hiện một kịch bản PHP từ dòng lệnh, nó được thừa hưởng các biến môi trường quy định tại shell của bạn. Điều đó có nghĩa bạn có thể đặt một biến môi trường bằng cách sử dụng lệnh xuất khẩu như sau:

export APPLICATION_ENV='staging' 
+0

Tôi biết, tôi không muốn thay đổi kịch bản. – Wiktor

+0

Xem câu trả lời đã chỉnh sửa ... – ciruvan

8

Không có cách nào để thiết lập biến môi trường từ dòng lệnh đặc biệt để thực hiện một kịch bản bởi các tùy chọn đi đến nhị phân PHP.

Bạn có một vài lựa chọn:

  1. Đặt biến trên toàn cầu trên hệ thống.
  2. Đặt biến trên dòng lệnh trước khi gọi tập lệnh. Điều này sẽ tồn tại trong môi trường sau khi kịch bản của bạn đã hoàn thành việc thực hiện, mà bạn có thể không muốn.
  3. Quấn tập lệnh PHP trong tập lệnh khác, cho phép bạn tạo biến tạm thời chỉ tồn tại trong thời lượng tập lệnh.
  4. Sử dụng tùy chọn dòng lệnh thay vì biến môi trường.

Hai tùy chọn cuối cùng có lẽ là cách sạch nhất để làm điều này, trong đó biến được tạo chỉ tồn tại trong thời gian chạy tập lệnh của bạn.

Việc triển khai tùy chọn 1 phụ thuộc vào hệ thống.

Việc triển khai tùy chọn 2 cũng phụ thuộc vào hệ thống - trên Windows bạn sẽ thực hiện set APPLICATION_ENV=staging&& php script.php và trên * nix, nó sẽ là export APPLICATION_ENV='staging' && php script.php.

Nếu bạn chọn tùy chọn 3, bạn có thể bị cám dỗ vì kịch bản lệnh shell, nhưng điều này không phải là di động (bạn cần một tệp batch cho Windows và kịch bản lệnh shell cho môi trường * nix. d đề nghị bạn viết một kịch bản PHP wrapper đơn giản, một cái gì đó như thế này:.

<?php 

    putenv('APPLICATION_ENV=staging'); 

    include('script.php'); 

điều này cho phép bạn để lại kịch bản mục tiêu của bạn không thay đổi và thiết lập các biến môi trường cho phiên làm việc của kịch bản chỉ

một kịch bản wrapper

phức tạp hơn có thể dễ dàng được tạo ra cho phép bạn chỉ định các biến trên dòng lệnh và thậm chí chỉ định động t sẽ được thực hiện khi các biến này được đặt.

Lựa chọn 4 có thể được thực hiện bằng cách sử dụng biến :

<?php 

    $applicationEnv = $argv[1]; 

    // rest of you script 

...và gọi kịch bản như:

php script.php staging 

Tuy nhiên, nó xảy ra với tôi rằng bạn dường như chỉ để kịch bản mà môi trường đang chạy trong (dàn, dev, sống, vv) - trong trường hợp nó mà có thể đơn giản nhất để đặt biến toàn bộ máy chủ và đổi tên nó khi cần thiết để tránh va chạm với các biến mà các ứng dụng khác có thể đang đặt. Bằng cách đó bạn có thể đơn giản gọi kịch bản và không cần phải lo lắng về điều này. Điều này giả định rằng bạn dàn dựng môi trường chạy trên một máy tính khác để sống (mà nó nên được).

2

Hãy thử sử dụng putenv và vượt qua các biến thông qua các thông số

php script.php APPLICATION_ENV=staging 

Và trong mã script.php:

for($i=1;$i<count($argv);$i++){ 
    putenv($argv[$i]); 
} 
5

Bạn có thể thiết lập một biến trong /etc/environment như FOO="bar" mà sau đó được tiếp cận với getenv() trong cả hai yêu cầu CLI và web. Bạn có thể cần phải relog để thay đổi này có hiệu lực.

+0

+1 Đối với "Bạn có thể cần phải relog [in] để thay đổi này có hiệu lực". Tôi đã đập đầu vào một bức tường tự hỏi tại sao những thứ trong '/ etc/environment' của tôi không hoạt động, cho đến khi tôi thấy nhận xét này. –

1

Tôi có tình huống tương tự và tôi sử dụng mã tiếp theo (nó làm việc cho tôi):

export APPLICATION_ENV=staging && php script.php 

Hy vọng nó sẽ hữu ích cho bạn quá.

3

Dưới đây là một ví dụ cho việc thiết lập một biến envirnnomental:

ENV_VAR='var' php script.php 

Chỉ trong trường hợp bạn muốn thiết lập nhiều biến Hãy thử điều này:

ENV_VAR1=1 ENV_VAR2=2 ENV_VAR3=3 php script.php