Apologies, two code focused posts in a row. I promise I‘ll get back to random waffle soon.
This has been annoying me tonight.
I’m working on a Moodle module for work today, creating a script that executes some feature of the module via the commandline (I’m resetting some records on a timer).
Moodle practice is to put scripts into a
cli folder within your module. To get access to your moodle instance you need to “
require” the config.php file from your application root.
Looking at some other scripts the standard practice is to have something like
require(dirname(dirname(dirname(__FILE__))) . '/config.php');
Here’s the problem. If your module is symlinked into your mod folder, then __FILE__ lies to you.
Say moodle is installed at
Your module should then be at
But you‘re smart, you keep your module separate from Moodle. You keep it in
/var/projects/your_module_name and symlink it in to the mod folder, at least in your development environment. When you call
dirname(__FILE__) PHP responds with
/var/projects/your_module_name/cli instead of
Ok, I can‘t use
__FILE__ to find the config.php file. PHP gives me
$_SERVER['PWD'] in CLI scripts, that will return the current directory. Yes! Problem solved.
Well, not quite.
It’s not inconceivable that you‘d want to run your script as the web user
sudo -u www-data php /var/www/mod/your_module_name/cli/your_cli_script.php
When you run the script using sudo the
$_SERVER['PWD'] is empty!
I ended up using this (for now). It’s not portable, but it lets me get going with the actual task I have to complete.
Next time I‘ll just use ruby.