Hi.

I have a webapp which uses Ajax to initiate a process on the server
which could take several minutes to complete and will go through many
steps to before the task is finished.

In that script, I update the session to indicate the current position
of the process.

When the user initiates the main process, another AJAX request is made
which examines the state of the main process (via the session) and
reports back to the client - keeps them interested. The user can also
abort the process and closing the browser also triggers an abort.

All works FINE in FF. In IE, I'm getting a "Page cannot be displayed"
sort of errror (having to debug the response to see this). This SEEMS
to relate to the fact that I am closing and opening the session in the
first script as I want to keep the session file uptodate. The process
script only has 1 output and that is the final result at the end of
the script.

I also tested this using a telnet connection to the webserver and sent
the same headers that FireFox generated (captured via FireBub) and it
bombed just before the data arrived (Lost connection).

e.g.

<?php
function UpdateSession($s_Progress) {
session_start();
$_SESSION['Progress'] = $s_Progress;
session_write_close();
}

//Stage 1
UpdateSession('Loading preferences');
...
//Stage 10
UpdateSession('Report generated and is now available at <a href="' .
MakeWebPath(realpath($s_PDFReport)) . '">here</a>.');
echo rawurlencode(json_encode(array('SUCCESS' =>
MakeWebPath(realpath($s_PDFReport)))));
?>


As a consequence, I get ...

Set-Cookie: PHPSESSID=uWPNRja2oT0PHPDCLqUiMzXiz1b; path=/
Set-Cookie: PHPSESSID=uWPNRja2oT0PHPDCLqUiMzXiz1b; path=/
Set-Cookie: PHPSESSID=uWPNRja2oT0PHPDCLqUiMzXiz1b; path=/
...

LOTS of times followed by a "Page cannot be displayed". If I use
Ethereal to examine the data, it is all there and is the same via IE
and FF, it is just the IE doesn't like the REALLY long header.

I accept this is normal behaviour and IE should "deal with it", but ...

Is there any mileage in stopping session_start from sending the same
header if it has already been sent? If the PHPSESSID is different,
then fine, send it.

From looking at session.c and php_session.h, I think the following
changes would suffice.

1 - The typedef struct _php_ps_globals {} needs to include ...

char *prev_id;


2 - In PHP_GINIT_FUNCTION(ps) ...

ps_globals->prev_id = NULL;


3 - In php_session_send_cookie(TSRMLS_D), do a comparison of prev_id
and id (taking into account prev_id could be NULL) and if different,
then allow the cookie to be set and to update prev_id with the id
sent.


Some other issues, if other parts of the cookie are altered, then
maybe rather than just examining the ID, the entire cookie should be
remembered.


Assuming that the cookie would be identical, repeatedly sending it to
the client when the session is repeatedly opened is a pain and I think
can easily be fixed.


Thank you for your time.

Richard Quadling.



--
-----
Richard Quadling
Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731
"Standing on the shoulders of some very clever giants!"

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to