You're probably running into server process time outs here. The server is what's giving up, not PHP.
Let me explain this too you.
For this discussion, there are two types of programming languages interpreted and compiled (we won't get into those that attempt to fall somewhere in the middle like Java).
In a compiled language you write the code, run the code through a compiler which then creates a file that is in native machine language.
In an interpreted language you write the code, then when you wish to run the program you run it through the intrepeter which turns it into native machine code on the fly and executes it without saving the output.
This means that all code is basically compiled. Interpreted code is compiled when it's run, every time it's run. Compiled code is compiled once and then run over and over.
The upside of interpreted code is that code changes are easier to implement cause there are no intermediate steps for the programmer.
The downside is that it takes A LOT longer for the code to begin executing.
Now how does this relate to your problem you ask?
Well, if the file is 1.5 megabytes and each character is 1 byte you're looking at about 1572864 characters in that file. So the php interpreter has to parse over 1 million characters turn it into machine code and then execute it. The server is probably nailing this as a run away process and just sending out the raw code. Now since the raw code is sent with a header of text/php and the browser doesn't know what to do with text/php it tries to save the file to disk.