I searched the doc and tried a lot of possible syntaxes, but cannot find a way to use Balena Device Variables into my PHP scripts. The only way I found was to create a file from my startup script, running into bash and echoing into a config.php script with ${Device_var} value, but wanted to be able to use them directly into PHP.
Hi there,
Those variables are set as your application container environment variables by the engine. Normally, in PHP, you should be able to access them withgetenv function.
If you don’t get the expected value with that function, you might want to check how the entry point of your container is organized. But first, please make sure if getenv('YOUR_VAR_NAME') works for you.
Thank you Roman for your swift reply. No, helaas, that’s one of the think I tried, but I cannot get the variable value with getenv or do we need to use a specific syntax to compose the variable name?
Hi @theonlyzby, it would help if you could share the code you are using so we can see where the issue is. That being said the following snippet will first dump all the available environment variables and then echo out the BALENA_APP_ID environment variable so you can see the required syntax:
<?php
// Dump all available environment variables
var_dump(getenv());
// Get a specific environment variable
echo(getenv("BALENA_APP_ID"));
Program (I copied your code, but you will see I don’t get values from the Balena Device Variables):
<?php
// Dump all available environment variables
var_dump(getenv());
$val = getenv('BALENA_APP_ID');
echo("Value =>".$val."<=");
?>
Hi @theonlyzby, thanks for the info. Can you also provide the Dockerfile you are using to deploy this code? Are you running this code in an application container? Also note that if you are running in local mode you won’t have access to the device environment variables set via the dashboard but I don’t think this is the case here: https://www.balena.io/docs/learn/develop/local-mode/#caveats
Hey @theonlyzby sorry could you clarify what do you mean by: running it into a “stater” balena container? Did you try running the script Gareth linked above from your /opt/start.sh?
No, I am running it from my /data/www directory, through PHP, calling it from my browser, served by NGINX & PHP fastCGI. I only meant it was running into a “starter” Balena docker container, in production mode, as asked. My appologies for the introduced confusion
Hi @theonlyzby,
Let’s first try to confirm that the environment variables reach your container.
Can you please go to the device summary page, use the webterminal to connect to your application’s container and run env in there.
That should print all the environment variables available in your application’s container (possibly including a few sensitive ones, so don’t paste them in here).
Please check whether the environment variables you did set in the dashboard appear in that list and let us know.
If they indeed appear, then the issue is probably configuring the PHP server to pick them up.
Pretty nice precision about the working of these variables you give me, @thgreasi !
I indeed get them also with env in bash (so did I with ${var} in my start script).
So, I can tell you now, I have an issue anly in web mode, in PHP CLI mode, I also get all variables available…
After a bit more of research, I found that I need to modify my FPM config file (/etc/php/7.3/fpm/pool.d/www.conf), and NOT clear the env , so uncomment the last line:
…
; Clear environment in FPM workers
; Prevents arbitrary environment variables from reaching FPM worker processes
; by clearing the environment in workers before env vars specified in this
; pool configuration are added.
; Setting to “no” will make all environment variables available to PHP code
; via getenv(), $_ENV and $_SERVER.
; Default Value: yes
;clear_env = no
…
… And start php-fpm with init.d and NOT use service!?!
so, I need to modify my start.sh with this:
/etc/init.d/php7.3-fpm start
instead of
service php7.3-fpm start