How can I avoid showing “#!/usr/bin/php” on PHP?
I want PHP scripts to run both on command line and website (I use Apache and Nginx) so I put #!/usr/bin/php in the first line of my scripts but that appears on the website...
php apache shell nginx command-line-interface
add a comment |
I want PHP scripts to run both on command line and website (I use Apache and Nginx) so I put #!/usr/bin/php in the first line of my scripts but that appears on the website...
php apache shell nginx command-line-interface
If you already use apache for serving PHP, just configure nginx as reverse proxy for apache.
– Qwerty
Nov 5 '10 at 11:08
add a comment |
I want PHP scripts to run both on command line and website (I use Apache and Nginx) so I put #!/usr/bin/php in the first line of my scripts but that appears on the website...
php apache shell nginx command-line-interface
I want PHP scripts to run both on command line and website (I use Apache and Nginx) so I put #!/usr/bin/php in the first line of my scripts but that appears on the website...
php apache shell nginx command-line-interface
php apache shell nginx command-line-interface
edited Apr 6 '16 at 22:15
Viliam Simko
1,0461026
1,0461026
asked Nov 5 '10 at 11:03
brainsqueezer
61126
61126
If you already use apache for serving PHP, just configure nginx as reverse proxy for apache.
– Qwerty
Nov 5 '10 at 11:08
add a comment |
If you already use apache for serving PHP, just configure nginx as reverse proxy for apache.
– Qwerty
Nov 5 '10 at 11:08
If you already use apache for serving PHP, just configure nginx as reverse proxy for apache.
– Qwerty
Nov 5 '10 at 11:08
If you already use apache for serving PHP, just configure nginx as reverse proxy for apache.
– Qwerty
Nov 5 '10 at 11:08
add a comment |
6 Answers
6
active
oldest
votes
I solved the problem using output buffering.
My script now looks like this:
#!/usr/bin/php
<?php
@ob_end_clean();
...
Note: There is no ?>
at the end of the file. This is actually a good practice when writing PHP scripts. This prevents any garbage text to be accidentally printed.
Note: The PHP documentation for ob_end_clean()
says that:
The output buffer must be started by ob_start() with
PHP_OUTPUT_HANDLER_CLEANABLE and PHP_OUTPUT_HANDLER_REMOVABLE flags.
Otherwise ob_end_clean() will not work.
It seems that this is done automatically when PHP runs from command line.
1
Very nice solution! Works, thanks!!!
– CDR
Oct 31 '12 at 9:23
2
Do you need anob_start();
as well? Probably worth mentioning.
– Floris
Apr 3 '14 at 15:32
I think you can mark this answer as accepted (already 5+ years) :-)
– Viliam Simko
Apr 29 '16 at 13:23
This is beautiful.
– Cryptopat
Feb 7 '18 at 18:35
Nice idea, but @Floris had a crucial point here. Please see my answer, where I've addressed that issue.
– Sz.
Nov 12 '18 at 23:59
add a comment |
There is no need to have #!/usr/bin/php
in your code, just run CLI script using php
, for example php /path/to/file.php
or /usr/bin/php /path/to/file.php
.
But if you want to create an executable script that can run from shell, you need to solve this issue.
– Viliam Simko
Nov 6 '14 at 16:19
add a comment |
I generally find it a good idea to separate logic from presentation. When I do something like this, I put as much as possible in a library, and then write separate cli and web interfaces for it.
That said, calling it with the php command is probably an easier fix.
1
+1 for separation of logic. Typically CLI and web will require separate interfaces (interacting with$argv
instead of$_GET
for example). So there's no real need for the same file to be called from both.
– ircmaxell
Nov 5 '10 at 12:24
add a comment |
@ViliamSimko's wicked trick is almost there, but, unfortunately, flawed. (It did actually break my header-sending sequence, for instance, despite not polluting the output with the shebang.)
TL;DR, here's the fix*:
#!/usr/bin/php
<?php @ob_end_clean(); if(ini_get('output_buffering')) ob_start();
...
or, less obscene-looking, but still just an euphemism for the same offense ;) :
#!/usr/bin/php
<?php if (ob_get_level()) { ob_end_clean(); ob_start(); }
...
(And see also the "UPDATE" part below for perhaps the maximum we can do about this...)
Explanation:
@Floris had a very good point in the comments there:
Do you need an ob_start(); as well? Probably worth mentioning.
You sure do. But where? And when?
Cases to consider:
As Viliam said (and just confirmed it with PHP 7.2), the shebang is fortunately eaten by the
php
command itself, when you run your script withphp yourscript.php
, so the entire trick is redundant.In web mode, it's actually config-dependent: if
output_buffering
is on in the config (and sure enough, it's usually on, but it's not even the default), anob_start
has already been done implicitly at the start of the script (you can check it withob_get_level()
). So, we can't just abruptly cancel it with anob_end_clean
and call it a day: we need to start another one, to keep the levels balanced!
If
output_buffering
is off in the config, then, sad face, we are out of luck:ob_get_clean()
does nothing, and the shebang will end up in the top of the page.
Note: there is no fix for this one, other than turning it on.
In command-line mode, the manual says about
output_buffering
:
This directive is always Off in PHP-CLI.
But, instead of failing the same hopeless way as in 3., the implicit shebang cleanup (see 1.) saves the day.
* "Fix" in the sense that this audacious hack will work in a lot more cases. If you are in full control of your PHP env., it can be just fine (as is in my case). Otherwise, it can still break in lots of subtle ways unexpectedly (consider auto-prepended code, custom extensions, or other possible ways to control output buffering etc.). Also, for example, when include
d from other scripts in CLI mode (where there's no buffering), you are still out of luck: the shebang will show up in the output, no matter what (unless, of course, filtered out manually by the caller). Not only that, but it would also break up your own buffering, if you happened to have any, while including such a naughtified script.
UPDATE: Just for the fun of it, here's an "almost correct" version, which plays along nicely with an ongoing buffering, be it implicit or user-level:
#!/usr/bin/php
<?php
if (ob_get_level()) {
$buf = ob_get_clean();
ob_start();
// Refill the buffer, but without the shebang line:
echo substr($buf, 0, strpos($buf, file(__FILE__)[0]));
} // else { out of luck... }
Still only "almost" correct, as nothing can fix output_buffering = 0
in web mode, and the "being included with no buffering" case can only be solved if the calling script adds an explicit ob_start
- ob_end_...
wrapping. Also, most of the caveats above still apply: various subtleties can still break it (e.g. the current output buffer must have the (fortunately default) PHP_OUTPUT_HANDLER_CLEANABLE
flag etc.).)
add a comment |
Call the script using the php
command
How can be done? You mean for Nginx? I use php-fpm on debian
– brainsqueezer
Nov 5 '10 at 11:08
It's true that you can run the script usingphp
command. However, if you want to make an executable script (chmod +x yourscript.php
) you need to add the hashbang (#!) to the first line of your script.
– Viliam Simko
Feb 14 '17 at 9:51
add a comment |
The output buffering solution above is a hack. Don't do that.
First thing, you are actually better using the env command to determine which php is being used:
#!/usr/bin/env php
Then give it permission to be executed by itself:
chmod +x myfile
So instead of calling 'php myfile', you now just run:
./myfile
From that folder. Hope this helps!
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f4105278%2fhow-can-i-avoid-showing-usr-bin-php-on-php%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
I solved the problem using output buffering.
My script now looks like this:
#!/usr/bin/php
<?php
@ob_end_clean();
...
Note: There is no ?>
at the end of the file. This is actually a good practice when writing PHP scripts. This prevents any garbage text to be accidentally printed.
Note: The PHP documentation for ob_end_clean()
says that:
The output buffer must be started by ob_start() with
PHP_OUTPUT_HANDLER_CLEANABLE and PHP_OUTPUT_HANDLER_REMOVABLE flags.
Otherwise ob_end_clean() will not work.
It seems that this is done automatically when PHP runs from command line.
1
Very nice solution! Works, thanks!!!
– CDR
Oct 31 '12 at 9:23
2
Do you need anob_start();
as well? Probably worth mentioning.
– Floris
Apr 3 '14 at 15:32
I think you can mark this answer as accepted (already 5+ years) :-)
– Viliam Simko
Apr 29 '16 at 13:23
This is beautiful.
– Cryptopat
Feb 7 '18 at 18:35
Nice idea, but @Floris had a crucial point here. Please see my answer, where I've addressed that issue.
– Sz.
Nov 12 '18 at 23:59
add a comment |
I solved the problem using output buffering.
My script now looks like this:
#!/usr/bin/php
<?php
@ob_end_clean();
...
Note: There is no ?>
at the end of the file. This is actually a good practice when writing PHP scripts. This prevents any garbage text to be accidentally printed.
Note: The PHP documentation for ob_end_clean()
says that:
The output buffer must be started by ob_start() with
PHP_OUTPUT_HANDLER_CLEANABLE and PHP_OUTPUT_HANDLER_REMOVABLE flags.
Otherwise ob_end_clean() will not work.
It seems that this is done automatically when PHP runs from command line.
1
Very nice solution! Works, thanks!!!
– CDR
Oct 31 '12 at 9:23
2
Do you need anob_start();
as well? Probably worth mentioning.
– Floris
Apr 3 '14 at 15:32
I think you can mark this answer as accepted (already 5+ years) :-)
– Viliam Simko
Apr 29 '16 at 13:23
This is beautiful.
– Cryptopat
Feb 7 '18 at 18:35
Nice idea, but @Floris had a crucial point here. Please see my answer, where I've addressed that issue.
– Sz.
Nov 12 '18 at 23:59
add a comment |
I solved the problem using output buffering.
My script now looks like this:
#!/usr/bin/php
<?php
@ob_end_clean();
...
Note: There is no ?>
at the end of the file. This is actually a good practice when writing PHP scripts. This prevents any garbage text to be accidentally printed.
Note: The PHP documentation for ob_end_clean()
says that:
The output buffer must be started by ob_start() with
PHP_OUTPUT_HANDLER_CLEANABLE and PHP_OUTPUT_HANDLER_REMOVABLE flags.
Otherwise ob_end_clean() will not work.
It seems that this is done automatically when PHP runs from command line.
I solved the problem using output buffering.
My script now looks like this:
#!/usr/bin/php
<?php
@ob_end_clean();
...
Note: There is no ?>
at the end of the file. This is actually a good practice when writing PHP scripts. This prevents any garbage text to be accidentally printed.
Note: The PHP documentation for ob_end_clean()
says that:
The output buffer must be started by ob_start() with
PHP_OUTPUT_HANDLER_CLEANABLE and PHP_OUTPUT_HANDLER_REMOVABLE flags.
Otherwise ob_end_clean() will not work.
It seems that this is done automatically when PHP runs from command line.
edited Apr 27 '16 at 15:37
answered Jul 21 '11 at 7:47
Viliam Simko
1,0461026
1,0461026
1
Very nice solution! Works, thanks!!!
– CDR
Oct 31 '12 at 9:23
2
Do you need anob_start();
as well? Probably worth mentioning.
– Floris
Apr 3 '14 at 15:32
I think you can mark this answer as accepted (already 5+ years) :-)
– Viliam Simko
Apr 29 '16 at 13:23
This is beautiful.
– Cryptopat
Feb 7 '18 at 18:35
Nice idea, but @Floris had a crucial point here. Please see my answer, where I've addressed that issue.
– Sz.
Nov 12 '18 at 23:59
add a comment |
1
Very nice solution! Works, thanks!!!
– CDR
Oct 31 '12 at 9:23
2
Do you need anob_start();
as well? Probably worth mentioning.
– Floris
Apr 3 '14 at 15:32
I think you can mark this answer as accepted (already 5+ years) :-)
– Viliam Simko
Apr 29 '16 at 13:23
This is beautiful.
– Cryptopat
Feb 7 '18 at 18:35
Nice idea, but @Floris had a crucial point here. Please see my answer, where I've addressed that issue.
– Sz.
Nov 12 '18 at 23:59
1
1
Very nice solution! Works, thanks!!!
– CDR
Oct 31 '12 at 9:23
Very nice solution! Works, thanks!!!
– CDR
Oct 31 '12 at 9:23
2
2
Do you need an
ob_start();
as well? Probably worth mentioning.– Floris
Apr 3 '14 at 15:32
Do you need an
ob_start();
as well? Probably worth mentioning.– Floris
Apr 3 '14 at 15:32
I think you can mark this answer as accepted (already 5+ years) :-)
– Viliam Simko
Apr 29 '16 at 13:23
I think you can mark this answer as accepted (already 5+ years) :-)
– Viliam Simko
Apr 29 '16 at 13:23
This is beautiful.
– Cryptopat
Feb 7 '18 at 18:35
This is beautiful.
– Cryptopat
Feb 7 '18 at 18:35
Nice idea, but @Floris had a crucial point here. Please see my answer, where I've addressed that issue.
– Sz.
Nov 12 '18 at 23:59
Nice idea, but @Floris had a crucial point here. Please see my answer, where I've addressed that issue.
– Sz.
Nov 12 '18 at 23:59
add a comment |
There is no need to have #!/usr/bin/php
in your code, just run CLI script using php
, for example php /path/to/file.php
or /usr/bin/php /path/to/file.php
.
But if you want to create an executable script that can run from shell, you need to solve this issue.
– Viliam Simko
Nov 6 '14 at 16:19
add a comment |
There is no need to have #!/usr/bin/php
in your code, just run CLI script using php
, for example php /path/to/file.php
or /usr/bin/php /path/to/file.php
.
But if you want to create an executable script that can run from shell, you need to solve this issue.
– Viliam Simko
Nov 6 '14 at 16:19
add a comment |
There is no need to have #!/usr/bin/php
in your code, just run CLI script using php
, for example php /path/to/file.php
or /usr/bin/php /path/to/file.php
.
There is no need to have #!/usr/bin/php
in your code, just run CLI script using php
, for example php /path/to/file.php
or /usr/bin/php /path/to/file.php
.
answered Nov 5 '10 at 11:08
David Kuridža
4,89752125
4,89752125
But if you want to create an executable script that can run from shell, you need to solve this issue.
– Viliam Simko
Nov 6 '14 at 16:19
add a comment |
But if you want to create an executable script that can run from shell, you need to solve this issue.
– Viliam Simko
Nov 6 '14 at 16:19
But if you want to create an executable script that can run from shell, you need to solve this issue.
– Viliam Simko
Nov 6 '14 at 16:19
But if you want to create an executable script that can run from shell, you need to solve this issue.
– Viliam Simko
Nov 6 '14 at 16:19
add a comment |
I generally find it a good idea to separate logic from presentation. When I do something like this, I put as much as possible in a library, and then write separate cli and web interfaces for it.
That said, calling it with the php command is probably an easier fix.
1
+1 for separation of logic. Typically CLI and web will require separate interfaces (interacting with$argv
instead of$_GET
for example). So there's no real need for the same file to be called from both.
– ircmaxell
Nov 5 '10 at 12:24
add a comment |
I generally find it a good idea to separate logic from presentation. When I do something like this, I put as much as possible in a library, and then write separate cli and web interfaces for it.
That said, calling it with the php command is probably an easier fix.
1
+1 for separation of logic. Typically CLI and web will require separate interfaces (interacting with$argv
instead of$_GET
for example). So there's no real need for the same file to be called from both.
– ircmaxell
Nov 5 '10 at 12:24
add a comment |
I generally find it a good idea to separate logic from presentation. When I do something like this, I put as much as possible in a library, and then write separate cli and web interfaces for it.
That said, calling it with the php command is probably an easier fix.
I generally find it a good idea to separate logic from presentation. When I do something like this, I put as much as possible in a library, and then write separate cli and web interfaces for it.
That said, calling it with the php command is probably an easier fix.
answered Nov 5 '10 at 11:23
Chris
1,20586
1,20586
1
+1 for separation of logic. Typically CLI and web will require separate interfaces (interacting with$argv
instead of$_GET
for example). So there's no real need for the same file to be called from both.
– ircmaxell
Nov 5 '10 at 12:24
add a comment |
1
+1 for separation of logic. Typically CLI and web will require separate interfaces (interacting with$argv
instead of$_GET
for example). So there's no real need for the same file to be called from both.
– ircmaxell
Nov 5 '10 at 12:24
1
1
+1 for separation of logic. Typically CLI and web will require separate interfaces (interacting with
$argv
instead of $_GET
for example). So there's no real need for the same file to be called from both.– ircmaxell
Nov 5 '10 at 12:24
+1 for separation of logic. Typically CLI and web will require separate interfaces (interacting with
$argv
instead of $_GET
for example). So there's no real need for the same file to be called from both.– ircmaxell
Nov 5 '10 at 12:24
add a comment |
@ViliamSimko's wicked trick is almost there, but, unfortunately, flawed. (It did actually break my header-sending sequence, for instance, despite not polluting the output with the shebang.)
TL;DR, here's the fix*:
#!/usr/bin/php
<?php @ob_end_clean(); if(ini_get('output_buffering')) ob_start();
...
or, less obscene-looking, but still just an euphemism for the same offense ;) :
#!/usr/bin/php
<?php if (ob_get_level()) { ob_end_clean(); ob_start(); }
...
(And see also the "UPDATE" part below for perhaps the maximum we can do about this...)
Explanation:
@Floris had a very good point in the comments there:
Do you need an ob_start(); as well? Probably worth mentioning.
You sure do. But where? And when?
Cases to consider:
As Viliam said (and just confirmed it with PHP 7.2), the shebang is fortunately eaten by the
php
command itself, when you run your script withphp yourscript.php
, so the entire trick is redundant.In web mode, it's actually config-dependent: if
output_buffering
is on in the config (and sure enough, it's usually on, but it's not even the default), anob_start
has already been done implicitly at the start of the script (you can check it withob_get_level()
). So, we can't just abruptly cancel it with anob_end_clean
and call it a day: we need to start another one, to keep the levels balanced!
If
output_buffering
is off in the config, then, sad face, we are out of luck:ob_get_clean()
does nothing, and the shebang will end up in the top of the page.
Note: there is no fix for this one, other than turning it on.
In command-line mode, the manual says about
output_buffering
:
This directive is always Off in PHP-CLI.
But, instead of failing the same hopeless way as in 3., the implicit shebang cleanup (see 1.) saves the day.
* "Fix" in the sense that this audacious hack will work in a lot more cases. If you are in full control of your PHP env., it can be just fine (as is in my case). Otherwise, it can still break in lots of subtle ways unexpectedly (consider auto-prepended code, custom extensions, or other possible ways to control output buffering etc.). Also, for example, when include
d from other scripts in CLI mode (where there's no buffering), you are still out of luck: the shebang will show up in the output, no matter what (unless, of course, filtered out manually by the caller). Not only that, but it would also break up your own buffering, if you happened to have any, while including such a naughtified script.
UPDATE: Just for the fun of it, here's an "almost correct" version, which plays along nicely with an ongoing buffering, be it implicit or user-level:
#!/usr/bin/php
<?php
if (ob_get_level()) {
$buf = ob_get_clean();
ob_start();
// Refill the buffer, but without the shebang line:
echo substr($buf, 0, strpos($buf, file(__FILE__)[0]));
} // else { out of luck... }
Still only "almost" correct, as nothing can fix output_buffering = 0
in web mode, and the "being included with no buffering" case can only be solved if the calling script adds an explicit ob_start
- ob_end_...
wrapping. Also, most of the caveats above still apply: various subtleties can still break it (e.g. the current output buffer must have the (fortunately default) PHP_OUTPUT_HANDLER_CLEANABLE
flag etc.).)
add a comment |
@ViliamSimko's wicked trick is almost there, but, unfortunately, flawed. (It did actually break my header-sending sequence, for instance, despite not polluting the output with the shebang.)
TL;DR, here's the fix*:
#!/usr/bin/php
<?php @ob_end_clean(); if(ini_get('output_buffering')) ob_start();
...
or, less obscene-looking, but still just an euphemism for the same offense ;) :
#!/usr/bin/php
<?php if (ob_get_level()) { ob_end_clean(); ob_start(); }
...
(And see also the "UPDATE" part below for perhaps the maximum we can do about this...)
Explanation:
@Floris had a very good point in the comments there:
Do you need an ob_start(); as well? Probably worth mentioning.
You sure do. But where? And when?
Cases to consider:
As Viliam said (and just confirmed it with PHP 7.2), the shebang is fortunately eaten by the
php
command itself, when you run your script withphp yourscript.php
, so the entire trick is redundant.In web mode, it's actually config-dependent: if
output_buffering
is on in the config (and sure enough, it's usually on, but it's not even the default), anob_start
has already been done implicitly at the start of the script (you can check it withob_get_level()
). So, we can't just abruptly cancel it with anob_end_clean
and call it a day: we need to start another one, to keep the levels balanced!
If
output_buffering
is off in the config, then, sad face, we are out of luck:ob_get_clean()
does nothing, and the shebang will end up in the top of the page.
Note: there is no fix for this one, other than turning it on.
In command-line mode, the manual says about
output_buffering
:
This directive is always Off in PHP-CLI.
But, instead of failing the same hopeless way as in 3., the implicit shebang cleanup (see 1.) saves the day.
* "Fix" in the sense that this audacious hack will work in a lot more cases. If you are in full control of your PHP env., it can be just fine (as is in my case). Otherwise, it can still break in lots of subtle ways unexpectedly (consider auto-prepended code, custom extensions, or other possible ways to control output buffering etc.). Also, for example, when include
d from other scripts in CLI mode (where there's no buffering), you are still out of luck: the shebang will show up in the output, no matter what (unless, of course, filtered out manually by the caller). Not only that, but it would also break up your own buffering, if you happened to have any, while including such a naughtified script.
UPDATE: Just for the fun of it, here's an "almost correct" version, which plays along nicely with an ongoing buffering, be it implicit or user-level:
#!/usr/bin/php
<?php
if (ob_get_level()) {
$buf = ob_get_clean();
ob_start();
// Refill the buffer, but without the shebang line:
echo substr($buf, 0, strpos($buf, file(__FILE__)[0]));
} // else { out of luck... }
Still only "almost" correct, as nothing can fix output_buffering = 0
in web mode, and the "being included with no buffering" case can only be solved if the calling script adds an explicit ob_start
- ob_end_...
wrapping. Also, most of the caveats above still apply: various subtleties can still break it (e.g. the current output buffer must have the (fortunately default) PHP_OUTPUT_HANDLER_CLEANABLE
flag etc.).)
add a comment |
@ViliamSimko's wicked trick is almost there, but, unfortunately, flawed. (It did actually break my header-sending sequence, for instance, despite not polluting the output with the shebang.)
TL;DR, here's the fix*:
#!/usr/bin/php
<?php @ob_end_clean(); if(ini_get('output_buffering')) ob_start();
...
or, less obscene-looking, but still just an euphemism for the same offense ;) :
#!/usr/bin/php
<?php if (ob_get_level()) { ob_end_clean(); ob_start(); }
...
(And see also the "UPDATE" part below for perhaps the maximum we can do about this...)
Explanation:
@Floris had a very good point in the comments there:
Do you need an ob_start(); as well? Probably worth mentioning.
You sure do. But where? And when?
Cases to consider:
As Viliam said (and just confirmed it with PHP 7.2), the shebang is fortunately eaten by the
php
command itself, when you run your script withphp yourscript.php
, so the entire trick is redundant.In web mode, it's actually config-dependent: if
output_buffering
is on in the config (and sure enough, it's usually on, but it's not even the default), anob_start
has already been done implicitly at the start of the script (you can check it withob_get_level()
). So, we can't just abruptly cancel it with anob_end_clean
and call it a day: we need to start another one, to keep the levels balanced!
If
output_buffering
is off in the config, then, sad face, we are out of luck:ob_get_clean()
does nothing, and the shebang will end up in the top of the page.
Note: there is no fix for this one, other than turning it on.
In command-line mode, the manual says about
output_buffering
:
This directive is always Off in PHP-CLI.
But, instead of failing the same hopeless way as in 3., the implicit shebang cleanup (see 1.) saves the day.
* "Fix" in the sense that this audacious hack will work in a lot more cases. If you are in full control of your PHP env., it can be just fine (as is in my case). Otherwise, it can still break in lots of subtle ways unexpectedly (consider auto-prepended code, custom extensions, or other possible ways to control output buffering etc.). Also, for example, when include
d from other scripts in CLI mode (where there's no buffering), you are still out of luck: the shebang will show up in the output, no matter what (unless, of course, filtered out manually by the caller). Not only that, but it would also break up your own buffering, if you happened to have any, while including such a naughtified script.
UPDATE: Just for the fun of it, here's an "almost correct" version, which plays along nicely with an ongoing buffering, be it implicit or user-level:
#!/usr/bin/php
<?php
if (ob_get_level()) {
$buf = ob_get_clean();
ob_start();
// Refill the buffer, but without the shebang line:
echo substr($buf, 0, strpos($buf, file(__FILE__)[0]));
} // else { out of luck... }
Still only "almost" correct, as nothing can fix output_buffering = 0
in web mode, and the "being included with no buffering" case can only be solved if the calling script adds an explicit ob_start
- ob_end_...
wrapping. Also, most of the caveats above still apply: various subtleties can still break it (e.g. the current output buffer must have the (fortunately default) PHP_OUTPUT_HANDLER_CLEANABLE
flag etc.).)
@ViliamSimko's wicked trick is almost there, but, unfortunately, flawed. (It did actually break my header-sending sequence, for instance, despite not polluting the output with the shebang.)
TL;DR, here's the fix*:
#!/usr/bin/php
<?php @ob_end_clean(); if(ini_get('output_buffering')) ob_start();
...
or, less obscene-looking, but still just an euphemism for the same offense ;) :
#!/usr/bin/php
<?php if (ob_get_level()) { ob_end_clean(); ob_start(); }
...
(And see also the "UPDATE" part below for perhaps the maximum we can do about this...)
Explanation:
@Floris had a very good point in the comments there:
Do you need an ob_start(); as well? Probably worth mentioning.
You sure do. But where? And when?
Cases to consider:
As Viliam said (and just confirmed it with PHP 7.2), the shebang is fortunately eaten by the
php
command itself, when you run your script withphp yourscript.php
, so the entire trick is redundant.In web mode, it's actually config-dependent: if
output_buffering
is on in the config (and sure enough, it's usually on, but it's not even the default), anob_start
has already been done implicitly at the start of the script (you can check it withob_get_level()
). So, we can't just abruptly cancel it with anob_end_clean
and call it a day: we need to start another one, to keep the levels balanced!
If
output_buffering
is off in the config, then, sad face, we are out of luck:ob_get_clean()
does nothing, and the shebang will end up in the top of the page.
Note: there is no fix for this one, other than turning it on.
In command-line mode, the manual says about
output_buffering
:
This directive is always Off in PHP-CLI.
But, instead of failing the same hopeless way as in 3., the implicit shebang cleanup (see 1.) saves the day.
* "Fix" in the sense that this audacious hack will work in a lot more cases. If you are in full control of your PHP env., it can be just fine (as is in my case). Otherwise, it can still break in lots of subtle ways unexpectedly (consider auto-prepended code, custom extensions, or other possible ways to control output buffering etc.). Also, for example, when include
d from other scripts in CLI mode (where there's no buffering), you are still out of luck: the shebang will show up in the output, no matter what (unless, of course, filtered out manually by the caller). Not only that, but it would also break up your own buffering, if you happened to have any, while including such a naughtified script.
UPDATE: Just for the fun of it, here's an "almost correct" version, which plays along nicely with an ongoing buffering, be it implicit or user-level:
#!/usr/bin/php
<?php
if (ob_get_level()) {
$buf = ob_get_clean();
ob_start();
// Refill the buffer, but without the shebang line:
echo substr($buf, 0, strpos($buf, file(__FILE__)[0]));
} // else { out of luck... }
Still only "almost" correct, as nothing can fix output_buffering = 0
in web mode, and the "being included with no buffering" case can only be solved if the calling script adds an explicit ob_start
- ob_end_...
wrapping. Also, most of the caveats above still apply: various subtleties can still break it (e.g. the current output buffer must have the (fortunately default) PHP_OUTPUT_HANDLER_CLEANABLE
flag etc.).)
edited Nov 21 '18 at 18:53
answered Nov 12 '18 at 23:56
Sz.
1,2911824
1,2911824
add a comment |
add a comment |
Call the script using the php
command
How can be done? You mean for Nginx? I use php-fpm on debian
– brainsqueezer
Nov 5 '10 at 11:08
It's true that you can run the script usingphp
command. However, if you want to make an executable script (chmod +x yourscript.php
) you need to add the hashbang (#!) to the first line of your script.
– Viliam Simko
Feb 14 '17 at 9:51
add a comment |
Call the script using the php
command
How can be done? You mean for Nginx? I use php-fpm on debian
– brainsqueezer
Nov 5 '10 at 11:08
It's true that you can run the script usingphp
command. However, if you want to make an executable script (chmod +x yourscript.php
) you need to add the hashbang (#!) to the first line of your script.
– Viliam Simko
Feb 14 '17 at 9:51
add a comment |
Call the script using the php
command
Call the script using the php
command
answered Nov 5 '10 at 11:06
Petah
32.7k17126188
32.7k17126188
How can be done? You mean for Nginx? I use php-fpm on debian
– brainsqueezer
Nov 5 '10 at 11:08
It's true that you can run the script usingphp
command. However, if you want to make an executable script (chmod +x yourscript.php
) you need to add the hashbang (#!) to the first line of your script.
– Viliam Simko
Feb 14 '17 at 9:51
add a comment |
How can be done? You mean for Nginx? I use php-fpm on debian
– brainsqueezer
Nov 5 '10 at 11:08
It's true that you can run the script usingphp
command. However, if you want to make an executable script (chmod +x yourscript.php
) you need to add the hashbang (#!) to the first line of your script.
– Viliam Simko
Feb 14 '17 at 9:51
How can be done? You mean for Nginx? I use php-fpm on debian
– brainsqueezer
Nov 5 '10 at 11:08
How can be done? You mean for Nginx? I use php-fpm on debian
– brainsqueezer
Nov 5 '10 at 11:08
It's true that you can run the script using
php
command. However, if you want to make an executable script (chmod +x yourscript.php
) you need to add the hashbang (#!) to the first line of your script.– Viliam Simko
Feb 14 '17 at 9:51
It's true that you can run the script using
php
command. However, if you want to make an executable script (chmod +x yourscript.php
) you need to add the hashbang (#!) to the first line of your script.– Viliam Simko
Feb 14 '17 at 9:51
add a comment |
The output buffering solution above is a hack. Don't do that.
First thing, you are actually better using the env command to determine which php is being used:
#!/usr/bin/env php
Then give it permission to be executed by itself:
chmod +x myfile
So instead of calling 'php myfile', you now just run:
./myfile
From that folder. Hope this helps!
add a comment |
The output buffering solution above is a hack. Don't do that.
First thing, you are actually better using the env command to determine which php is being used:
#!/usr/bin/env php
Then give it permission to be executed by itself:
chmod +x myfile
So instead of calling 'php myfile', you now just run:
./myfile
From that folder. Hope this helps!
add a comment |
The output buffering solution above is a hack. Don't do that.
First thing, you are actually better using the env command to determine which php is being used:
#!/usr/bin/env php
Then give it permission to be executed by itself:
chmod +x myfile
So instead of calling 'php myfile', you now just run:
./myfile
From that folder. Hope this helps!
The output buffering solution above is a hack. Don't do that.
First thing, you are actually better using the env command to determine which php is being used:
#!/usr/bin/env php
Then give it permission to be executed by itself:
chmod +x myfile
So instead of calling 'php myfile', you now just run:
./myfile
From that folder. Hope this helps!
answered Apr 12 '17 at 10:21
delboy1978uk
7,2591726
7,2591726
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f4105278%2fhow-can-i-avoid-showing-usr-bin-php-on-php%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
If you already use apache for serving PHP, just configure nginx as reverse proxy for apache.
– Qwerty
Nov 5 '10 at 11:08