I think your method of writing it has too much overhead, while increasing max_execution_time will help, not everyone is able to modify their server settings. This simple thing split 15000 bytes of lorum ipsum text (2k Words) into 1000 character segments. I assume it would do well with more, as the execution time was fairly quick.
//Define variables, Set $x as int(1 = true) to start
$chapter = ("15000 bytes of Lorum Ipsum Here");
$sections = array();
$x = 1;
//Start Splitting
while( $x ) {
    //Get current length of $chapter
    $len = strlen($chapter);
    //If $chapter is longer than 1000 characters
    if( $len > 1000 ) {
        //Get Position of last space character before 1000
        $x = strrpos( substr( $chapter, 0, 1000), " ");
        //If $x is not FALSE - Found last space
        if( $x ) {
            //Add to $sections array, assign remainder to $chapter again
            $sections[] = substr( $chapter, 0, $x );
            $chapter = substr( $chapter, $x );
        //If $x is FALSE - No space in string
        } else {
            //Add last segment to $sections for debugging
            //Last segment will not have a space. Break loop.
            $sections[] = $chapter;
            break;
        }
    //If remaining $chapter is not longer than 1000, simply add to array and break.
    } else {
        $sections[] = $chapter;
        break;
    }
}
print_r($sections);
Edit:
- Tested with 5k Words (33K bytes) In a fraction of a second. Divided the text up into 33 segments. (Whoops, I had it set to divide into 10K character segments, before.) 
- Added verbose comments to code, as to explain what everything does.