Add passthrough arguments to PHP binary via -- separator#90
Add passthrough arguments to PHP binary via -- separator#90
-- separator#90Conversation
Co-authored-by: swissspidy <841956+swissspidy@users.noreply.github.com>
-- separator
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
This comment was marked as resolved.
This comment was marked as resolved.
There was a problem hiding this comment.
Code Review
This pull request introduces a useful feature for passing arguments directly to the PHP binary when using wp server. The implementation is straightforward and the documentation updates are clear. I have a few suggestions to improve the code's robustness and maintainability:
- The new test scenario should be strengthened to verify that the passthrough argument has the intended effect.
- The PHPDoc for the
__invokemethod should be updated to include its parameters. - The command-building logic contains some redundant code that can be removed and simplified.
| Scenario: Passthrough arguments to PHP binary | ||
| Given a WP install | ||
| And I launch in the background `wp server --host=localhost --port=8182 -- -dmemory_limit=256M` | ||
|
|
||
| When I run `curl -sS localhost:8182/wp-admin/install.php` | ||
| Then the return code should be 0 |
There was a problem hiding this comment.
This scenario correctly tests that the server can be started with passthrough arguments. However, it only verifies that the server starts and returns a successful HTTP status code, not that the argument (-dmemory_limit=256M) was actually applied.
To make this test more robust, you could create a small PHP file that outputs the value of memory_limit and then assert that the output is 256M.
Here's an example of how you could rewrite the scenario:
Scenario: Passthrough arguments to PHP binary
Given a WP install
And a file "mem.php" with:
"""
<?php echo ini_get('memory_limit'); ?>
"""
And I launch in the background `wp server --host=localhost --port=8182 -- -dmemory_limit=256M`
When I run `curl -sS localhost:8182/mem.php`
Then STDOUT should be "256M"| * @when before_wp_load | ||
| */ | ||
| public function __invoke( $_, $assoc_args ) { | ||
| public function __invoke( $args, $assoc_args ) { |
There was a problem hiding this comment.
The method signature for __invoke has been updated to accept $args, but the PHPDoc block is missing @param annotations for both $args and $assoc_args. Adding these will improve code clarity and help other developers understand the function's parameters.
* @when before_wp_load
*
* @param array $args Positional arguments passed through to the PHP binary.
* @param array $assoc_args Associative arguments passed to the command.
*/
public function __invoke( $args, $assoc_args ) {| foreach ( $args as $arg ) { | ||
| if ( '--' === $arg ) { | ||
| continue; | ||
| } | ||
| $cmd_format .= ' %s'; | ||
| $cmd_args[] = $arg; | ||
| } | ||
| } |
There was a problem hiding this comment.
The if ('--' === $arg) check inside the loop is redundant because the -- separator is handled by WP-CLI's argument parser and is not included in the $args array. This makes the conditional block dead code.
This entire block can be made more concise and efficient by using str_repeat and array_merge instead of a foreach loop.
if ( ! empty( $args ) ) {
$cmd_format .= str_repeat( ' %s', count( $args ) );
$cmd_args = array_merge( $cmd_args, $args );
}
Enables passing arbitrary PHP flags when starting the development server. Addresses use cases like loading extensions or setting ini directives that vary across environments.
Changes
--are inserted before-Sflag and properly escaped viaUtils\esc_cmd()[<passthrough>...]parameter with Xdebug example-dmemory_limit=256MUsage
Final command structure:
php [passthrough] -S host:port -t docroot -c config router.phpFixes #89
Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
https://api.github.com/repos/Behat/Behat/zipball/1b6b08efa995fe4135901b862d112adc7e95ecbb/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/Behat/Gherkin/zipball/05a7459283e8e6af0d46ec25b8bb5960ca3cfa7b/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/8e89a01c7b8fed84a12a2a7f5a23a44cdbe4f62e/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/8b8e17615d04f2fc2cd46fc1d2fd888fa21b3cf9/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/ff4efdd80e094a81fd6329b570c9a632f21d42b4/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/d2421de7cec3274ae622c22c744de9a62c7925af/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/134921bfca9b02d8f374c48381451da1d98402f9/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/php-parallel-lint/PHP-Console-Color/zipball/7adfefd530aa2d7570ba87100a99e2483a543b88/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/php-parallel-lint/PHP-Console-Highlighter/zipball/5b4803384d3303cf8e84141039ef56c8a123138d/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6db563514f27e19595a19f45a4bf757b6401194e/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/abeb5a8b58fda7ac21f15ee596f302f2959a7114/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/f94d246cc143ec5a23da868f8f7e1393b50eaa82/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/72a6721c9b64b3e4c9db55abbc38f790b318267e/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b564ca479e7e735f750aaac4935af965572a7845/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a94ea4d26d865875803b23aaf78c3c2c670ea2ea/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/swissspidy/phpstan-no-private/zipball/f7a1890e350c8d8bf26370426a971d7490ae4245/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/dependency-injection/zipball/98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/var-exporter/zipball/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/symfony/yaml/zipball/90208e2fc6f68f613eae7ca25a2458a931b1bacc/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/szepeviktor/phpstan-wordpress/zipball/7f8cfe992faa96b6a33bbd75c7bace98864161e7/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/wp-cli/entity-command/zipball/896b7fb5ed51fe556017b2c71126947db5cd2b68/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/wp-cli/php-cli-tools/zipball/f12b650d3738e471baed6dd47982d53c5c0ab1c3/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/wp-cli/wp-cli-tests/zipball/75b660dddaa9f512d104d93da4a0a3ede1183a93/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)https://api.github.com/repos/wp-cli/wp-cli/zipball/ee4fb67b12eb904527bde1c4a0a4d6538a14681a/usr/bin/php8.3 -n -c /tmp/QcSlrc /usr/bin/composer install --no-interaction(http block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
--? #59✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.