I wrestled with the same question while building an online testing application using framesets. Some times you just WANT to use frames...there are actually some great reasons for this. For instance, in my case I wanted to make sure the status bar at the bottom that displays the progress of the student, didn't disappear off the bottom of the screen on longer pages. It's very distracting to have your status indicator showing up in a different place on your page depending on how much content happens to be above it.
So anyway, a frameset simply calls two or more independent pages which may or may not be .php pages. If you have two .php pages being called by your frameset, it seems to me that Apache would handle each as a unique script, meaning that you need to start your session in both frames. If you must have the script in one frame execute before the script in the other frame, the best way I've found is to use javascript and do a simple location.replace on the frame containing the script that needs to execute after the first script. In my case, the student clicks a link to answer a question in the top frame, the data is immediately sent to the bottom frame which keeps score, then once the bottom frame has executed, it reloads the top frame to grab the next question.
Also, you should try to write the scripts in your dependent frames so they maintain their previous values until changed, and so that they use default values when none are provided. This might help make the loading order less relevant.
I had trouble figuring out the logic in my application until I realized that some of my code needed to be moved from my main-frame's script to my scoring frame's script. Sometimes a small change in your logic is all that's needed.
I don't know if that helps you, but it's the best I could do. Anyone else?
PS: I think doing an inline location replace on the target frame is faster than waiting for an onload. Just have PHP write a short javascript to the browser once it's finished the rest of its actions.