How can I avoid showing “#!/usr/bin/php” on PHP?










9















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...










share|improve this question
























  • If you already use apache for serving PHP, just configure nginx as reverse proxy for apache.

    – Qwerty
    Nov 5 '10 at 11:08















9















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...










share|improve this question
























  • If you already use apache for serving PHP, just configure nginx as reverse proxy for apache.

    – Qwerty
    Nov 5 '10 at 11:08













9












9








9


2






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...










share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Apr 6 '16 at 22:15









Viliam Simko

1,0561026




1,0561026










asked Nov 5 '10 at 11:03









brainsqueezerbrainsqueezer

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

















  • 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












6 Answers
6






active

oldest

votes


















18














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.






share|improve this answer




















  • 1





    Very nice solution! Works, thanks!!!

    – CDR
    Oct 31 '12 at 9:23






  • 2





    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











  • 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



















3














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.






share|improve this answer























  • 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


















2














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.






share|improve this answer


















  • 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














@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:



  1. 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 with php yourscript.php, so the entire trick is redundant.


  2. 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), an ob_start has already been done implicitly at the start of the script (you can check it with ob_get_level()). So, we can't just abruptly cancel it with an ob_end_clean and call it a day: we need to start another one, to keep the levels balanced!



  3. 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.




  4. 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 included 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.).)






share|improve this answer
































    0














    Call the script using the php command






    share|improve this answer























    • 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


















    -1














    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!






    share|improve this answer























    • I assume the downvotes are because what you describe (making the file executable, and using a shebang line) is what the questioner is already doing. Except, he's ALSO sometimes calling the same file through a webserver. So, in the browser, the shebang line prints. He's asking for a workaround for that. The output buffering hack for that appears to be the only method.

      – Dewi Morgan
      Jan 4 at 20:43










    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
    );



    );













    draft saved

    draft discarded


















    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









    18














    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.






    share|improve this answer




















    • 1





      Very nice solution! Works, thanks!!!

      – CDR
      Oct 31 '12 at 9:23






    • 2





      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











    • 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
















    18














    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.






    share|improve this answer




















    • 1





      Very nice solution! Works, thanks!!!

      – CDR
      Oct 31 '12 at 9:23






    • 2





      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











    • 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














    18












    18








    18







    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.






    share|improve this answer















    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.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Apr 27 '16 at 15:37

























    answered Jul 21 '11 at 7:47









    Viliam SimkoViliam Simko

    1,0561026




    1,0561026







    • 1





      Very nice solution! Works, thanks!!!

      – CDR
      Oct 31 '12 at 9:23






    • 2





      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











    • 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





      Very nice solution! Works, thanks!!!

      – CDR
      Oct 31 '12 at 9:23






    • 2





      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











    • 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














    3














    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.






    share|improve this answer























    • 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















    3














    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.






    share|improve this answer























    • 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













    3












    3








    3







    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.






    share|improve this answer













    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.







    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Nov 5 '10 at 11:08









    David KuridžaDavid Kuridža

    4,93252125




    4,93252125












    • 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





    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











    2














    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.






    share|improve this answer


















    • 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















    2














    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.






    share|improve this answer


















    • 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













    2












    2








    2







    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.






    share|improve this answer













    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.







    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Nov 5 '10 at 11:23









    ChrisChris

    1,21586




    1,21586







    • 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 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











    1














    @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:



    1. 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 with php yourscript.php, so the entire trick is redundant.


    2. 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), an ob_start has already been done implicitly at the start of the script (you can check it with ob_get_level()). So, we can't just abruptly cancel it with an ob_end_clean and call it a day: we need to start another one, to keep the levels balanced!



    3. 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.




    4. 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 included 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.).)






    share|improve this answer





























      1














      @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:



      1. 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 with php yourscript.php, so the entire trick is redundant.


      2. 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), an ob_start has already been done implicitly at the start of the script (you can check it with ob_get_level()). So, we can't just abruptly cancel it with an ob_end_clean and call it a day: we need to start another one, to keep the levels balanced!



      3. 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.




      4. 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 included 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.).)






      share|improve this answer



























        1












        1








        1







        @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:



        1. 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 with php yourscript.php, so the entire trick is redundant.


        2. 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), an ob_start has already been done implicitly at the start of the script (you can check it with ob_get_level()). So, we can't just abruptly cancel it with an ob_end_clean and call it a day: we need to start another one, to keep the levels balanced!



        3. 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.




        4. 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 included 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.).)






        share|improve this answer















        @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:



        1. 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 with php yourscript.php, so the entire trick is redundant.


        2. 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), an ob_start has already been done implicitly at the start of the script (you can check it with ob_get_level()). So, we can't just abruptly cancel it with an ob_end_clean and call it a day: we need to start another one, to keep the levels balanced!



        3. 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.




        4. 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 included 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.).)







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 21 '18 at 18:53

























        answered Nov 12 '18 at 23:56









        Sz.Sz.

        1,3711924




        1,3711924





















            0














            Call the script using the php command






            share|improve this answer























            • 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















            0














            Call the script using the php command






            share|improve this answer























            • 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













            0












            0








            0







            Call the script using the php command






            share|improve this answer













            Call the script using the php command







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Nov 5 '10 at 11:06









            PetahPetah

            32.8k17126188




            32.8k17126188












            • 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

















            • 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
















            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











            -1














            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!






            share|improve this answer























            • I assume the downvotes are because what you describe (making the file executable, and using a shebang line) is what the questioner is already doing. Except, he's ALSO sometimes calling the same file through a webserver. So, in the browser, the shebang line prints. He's asking for a workaround for that. The output buffering hack for that appears to be the only method.

              – Dewi Morgan
              Jan 4 at 20:43















            -1














            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!






            share|improve this answer























            • I assume the downvotes are because what you describe (making the file executable, and using a shebang line) is what the questioner is already doing. Except, he's ALSO sometimes calling the same file through a webserver. So, in the browser, the shebang line prints. He's asking for a workaround for that. The output buffering hack for that appears to be the only method.

              – Dewi Morgan
              Jan 4 at 20:43













            -1












            -1








            -1







            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!






            share|improve this answer













            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!







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Apr 12 '17 at 10:21









            delboy1978ukdelboy1978uk

            7,2991726




            7,2991726












            • I assume the downvotes are because what you describe (making the file executable, and using a shebang line) is what the questioner is already doing. Except, he's ALSO sometimes calling the same file through a webserver. So, in the browser, the shebang line prints. He's asking for a workaround for that. The output buffering hack for that appears to be the only method.

              – Dewi Morgan
              Jan 4 at 20:43

















            • I assume the downvotes are because what you describe (making the file executable, and using a shebang line) is what the questioner is already doing. Except, he's ALSO sometimes calling the same file through a webserver. So, in the browser, the shebang line prints. He's asking for a workaround for that. The output buffering hack for that appears to be the only method.

              – Dewi Morgan
              Jan 4 at 20:43
















            I assume the downvotes are because what you describe (making the file executable, and using a shebang line) is what the questioner is already doing. Except, he's ALSO sometimes calling the same file through a webserver. So, in the browser, the shebang line prints. He's asking for a workaround for that. The output buffering hack for that appears to be the only method.

            – Dewi Morgan
            Jan 4 at 20:43





            I assume the downvotes are because what you describe (making the file executable, and using a shebang line) is what the questioner is already doing. Except, he's ALSO sometimes calling the same file through a webserver. So, in the browser, the shebang line prints. He's asking for a workaround for that. The output buffering hack for that appears to be the only method.

            – Dewi Morgan
            Jan 4 at 20:43

















            draft saved

            draft discarded
















































            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.




            draft saved


            draft discarded














            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





















































            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







            Popular posts from this blog

            Darth Vader #20

            How to how show current date and time by default on contact form 7 in WordPress without taking input from user in datetimepicker

            Ondo