6 ms·
I think PHP has so many gotchas, so many ways to trip up even seasoned developers, that it's inevitable to miss something.
by tjogin 16y ago
I think PHP has so many gotchas, so many ways to trip up even seasoned developers, that it's inevitable to miss something.
- zaidf 16y agoI understand that view. But I am talking specifically about something that would just dump the code of the php file to the browser.
- yrashk 16y agothey just had a single typo i?php instead of <?php I guess somebody's using vim
- jarin 16y agoThat's why I always git diff and run tests before committing, I do that all the time :-/
- drdaeman 16y agoAnd this is the reason one should separate production and development environments and NEVER edit any files on production servers (let `git push` or something similiar handle it)
- russss 16y agoAt Last.fm we had a Subversion pre-commit hook which ensured that all .php files began with <?. That would have easily caught this problem, no drama.
- SoftwareMaven 16y agoUnless the file was checked in separately. If they were doing something like updating the db password, so they need to update "current running" and "up-and-coming" code. As a result, they may have made the change in production, with the typo, and the change in SVN, without the typo. I would put my money on something like this being the cause.
- KevBurnsJr 16y ago+1 to russ. PHP syntax checking on precommit would have caught this. Edit: I'm wrong. It does not catch this.
- zaidf 16y agoNot necessarily. Makes sense for syntax check to only check between php tags. Root of the issue is that by default php outputs anything not between php tags to the browser. Perhaps some sort of buffer control at the top most include can disable output to browser until a later time. That's pretty much how templating systems work except they don't disable output afaik thus leaving possibility of this open.
- dexen 16y agoYou could do ob_start(); include '...'; ob_end_clean();, but it turns out that die() (say, in a custom error handler) () causes an implicit buffer flush. So it's not a foolproof solution.
- bluesnowmonkey 16y agoYou can attach a callback to the buffer to prevent that implicit flush. ob_start(function() {});
- dexen 16y agoThanks, I'll investingate and probably adopt it for my code :D
- KevBurnsJr 16y agoOr register_shutdown_function - http://blog.kevburnsjr.com/php-fatal-error-500 http://blog.kevburnsjr.com/php-fatal-error-500
- bluesnowmonkey 16y agoExactly right. There's no reason for a config file (or any of the setup code) to be writing output. A good way to force this is by immediately starting an output buffer with a callback that returns nothing, then calling ob_end_clean() after setup is complete.
- Maxious 16y agoI think this was more of a systemic failure - the file that failed in this case was also relied upon to disable development mode/error output on production servers. I'm pretty sure my production web servers return a HTTP code 500 with no further output when they encounter an error with the php.ini-production configuration file provided in the PHP source distribution. The hitch was of course that the file in question had a "i?php" (someone was using vi and hit i too many times?) instead of "<?php" which lead the php interpreter to output that section of code as if it were HTML. That feature is something PHP could provide an option to disable and only allow explicit echo/print/printf which should be what templating engines use.
- KevBurnsJr 16y agoActually, PHP returns a 200 when it encounters a fatal error. This explains why it was indexed by Google.
- VMG 16y agoPutting passwords in the php file? That's not a seasoned developer in my mind.
- zaidf 16y agoGood point. Minus the keys/passwords the "harm" would be limited.
- Joakal 16y agoIt's needed to connect to databases with authentication. What would you suggest?
- eam 16y agoI believe the way to do it "correctly" would be to put the actual file containing the credentials in a non-public location and just do an include where you need to access it. At least that's how I do it. I could be wrong...
- windsurfer 16y agoIf you're doing an include, wouldn't the passwords still be in a PHP file?
- lsc 16y agoif the php file is printed rather than executed, the include will not be followed. You'd see the "include /path/to/inaccessible/file" but you wouldn't see the passwords within the include. I think. I haven't seriously used php since 2003 or so.
- russss 16y agoYes, but included files still need a <?php tag at the top, or PHP just prints them out.
- nbpoole 16y ago
- Tomek_ 16y agoPlease name at least 5 of them.
- dexen 16y agoTsk, tsk. It's trendy to blame PHP for every problem out there. Also, it's trendy to drop unseasoned developers onto it and expect them to build complex applications that are publicly accessible yet 100% foolproof. Go figure. If you asked me, I couldn't even tell. I've encoundered some in the past, sure, but found (in docs) both rationale and the correct way to use stuff. There was that reference-vs-value matter when passing objects around, in PHP v4.x, but that's fixed by v5.
- agotterer 16y agoShouldn't this have been caught by checking chsnges before committing them or on a staging server.