Hallo tweakers,
Ik had een vraagje betreffend php en mysql:
Via het bestand dl.php kan een bestand afgehaald worden. Tijdens het downloaden worden de stats bijgehouden in een mysql database. Via een ander bestand, getReport.php, kan men de stats bekijken voor die download (als die er is). Het probleem is dat, wanneer de download bezig is, en ik ondertussen (in een andere tab/window) getReport.php oproep, dan blijft die wachten tot dl.php gedaan heeft eer dat die iets terug geeft. Het is alsof 2 verbindingen vanuit dezelfde pc niet gaat...
Ik wil jullie niet opzadelen met een hele hoop code, dus zal maar de betreffende bestanden posten:
dl.php:
getReport.php:
downloadsDB.php:
Wat WEL werkt:
de download starten met dl.php, naar phpMyAdmin gaan, en daar zie ik duidelijk dat de waarden zijn toegevoegd, en regelmatig geupdated worden. Dus phpMyAdmin heeft een bepaalde manier van werken die precies doet wat ik zou willen...
Wat ik al geprobeerd heb:
- In plaats van mysql_connect() de variant mysql_pconnect, met de hoop dat het mss via dezelfde verbinding wel zou lukken
- In dl.php na elke query de verbinding te sluiten (en dus telkens terug te openen wanneer dat nodig was). Dit was niet alleen trager, maar hielp ook niet...
- De parameter new_link op true gezet bij mysql_connect, om mysql te verplichten een 2de verbinding te maken... Hielp niet.
Dus wat ik jullie zou willen vragen: Hoe verhelp ik dit? Oh, en alle tips zijn welkom betreffend de code, om bijvoorbeeld dingen te versnellen
Dank bij voorbaat!
PS: zoals jullie wrsch al gemerkt hebben, deze code is niet volledig af (dl.php zou voor meerdere bestanden moeten werken, enz...)
Edit:
Opgelost, zie verder
Ik had een vraagje betreffend php en mysql:
Via het bestand dl.php kan een bestand afgehaald worden. Tijdens het downloaden worden de stats bijgehouden in een mysql database. Via een ander bestand, getReport.php, kan men de stats bekijken voor die download (als die er is). Het probleem is dat, wanneer de download bezig is, en ik ondertussen (in een andere tab/window) getReport.php oproep, dan blijft die wachten tot dl.php gedaan heeft eer dat die iets terug geeft. Het is alsof 2 verbindingen vanuit dezelfde pc niet gaat...
Ik wil jullie niet opzadelen met een hele hoop code, dus zal maar de betreffende bestanden posten:
dl.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
| <?php require('inc_path.php'); require(INC_DIR . 'global_vars.php'); require(INC_DIR . 'downloadsDB.php'); // // Send a file // function send_file($sID, $path, $name) { $status = FALSE; // say we are connecting updateSession($sID, '123', 'connecting', '0', ''); if (!is_file($path . $name) or connection_status() != 0) return FALSE; // a connection_status of 0 means NORMAL header('Content-Type: application/octet-stream; name="' . $name . '"'); //This should work for Non IE/Opera browsers header('Content-Type: application/octetstream; name="' . $name . '"'); // This should work for IE & Opera header("Content-Disposition: attachment; filename=\"" . $name . "\""); header('Content-length: ' . (string) (filesize($path.$name))); header('Cache-Control: no-cache, must-revalidate'); header('Pragma: no-cache'); header('Expires: ' . gmdate('D, d M Y H:i:s', mktime(date('H') + 2, date('i'), date('s'), date('m'), date('d'), date('Y'))) . ' GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); if ($file = fopen($path . $name, 'rb')) { $i = 0; $total = filesize($path.$name); while (!feof($file) and (connection_status() == 0)) { updateSession($sID, '123', 'transferring', (int) ((float) $i * 100 / $total), ''); print(fread($file, 1024 * 8)); flush(); $i += 1024 * 8; } $status = (connection_status() == 0); fclose($file); } updateSession($sID, '123', 'complete', 100, ''); return($status); } // // Module body // session_start(); $sID = session_id(); session_write_close(); $connection = connectToDatabase(); if (!send_file($sID, '../../', 'archief.exe')) { die ('File Transfer Failed'); } else { // File sent ok - log it } mysql_close($connection); ?> |
getReport.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| <?php /////////////////////////////////////////////////////////////////////////////// // Get XML report // /////////////////////////////////////////////////////////////////////////////// // // // // Includes // require('inc_path.php'); require(INC_DIR . 'global_vars.php'); require(INC_DIR . 'downloadsDB.php'); // // Print XML // function printXml($fileName, $status, $progress, $queue) { header('Content-Type: text/xml'); echo('<?xml version="1.0" encoding="UTF-8"?>' . "\n"); echo('<as-download>' . "\n"); echo("\t" . '<filename>' . $fileName . '</filename>' . "\n"); echo("\t" . '<status>' . $status . '</status>' . "\n"); echo("\t" . '<progress>' . $progress . '</progress>' . "\n"); for ($i = 0; $i < count($queue); $i++) echo("\t" . '<queue>' . $queue[$i] . '</queue>' . "\n"); echo('</as-download>'); } // // an xml with an error message // function printErrorXml($message) { header('Content-Type: text/xml'); echo('<?xml version="1.0" encoding="UTF-8"?>' . "\n"); echo('<as-download>' . "\n"); echo("\t" . '<error>' . $message . '</error>' . "\n"); echo('</as-download>'); } // // Function calls // session_start(); $session_id = session_id(); session_write_close(); $connection = connectToDatabase(); if (getSessionData($session_id, &$fileID, &$status, &$progress, &$queue)) printXml($fileID, $status, $progress, $queue); else printErrorXml('no results!'); mysql_close($connection); ?> |
downloadsDB.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| <?php function connectToDatabase() { $dbh = mysql_connect(DATABASE_SERVER, DATABASE_USER, DATABASE_PASS) or die('Could not connect to database because: ' . mysql_error()); @mysql_select_db(DATABASE_NAME) or die('Unable to select database: ' . mysql_error()); return $dbh; } function updateSession($sessionID, $fileID, $status, $progress, $queue) { $query = "SELECT * FROM `" . DOWNLOADS_TABLE . "` WHERE sessionID='$sessionID'"; $result = mysql_query($query); $query = NULL; if (mysql_affected_rows() < 1) { $query = "INSERT INTO `" . DOWNLOADS_TABLE . "` (sessionID, fileID, status, progress, queue) VALUES ('$sessionID', '$fileID', '$status', '$progress', '$queue')"; } else if ( $fileID != mysql_result($result, 0, 'fileID') || $status != mysql_result($result, 0, 'status') || $progress != mysql_result($result, 0, 'progress') || $queue != mysql_result($result, 0, 'queue') ) { $query = "UPDATE `" . DOWNLOADS_TABLE . "` SET fileID='$fileID', status='$status', progress='$progress', queue='$queue' WHERE sessionID='$sessionID'"; } mysql_query($query); } function getSessionData($sessionID, &$fileID, &$status, &$progress, &$queue) { $query = "SELECT * FROM `" . DOWNLOADS_TABLE . "` WHERE sessionID='$sessionID'"; $result = mysql_query($query); if (mysql_affected_rows() < 1) return false; $fileID = mysql_result($result, 0, 'fileID'); $status = mysql_result($result, 0, 'status'); $progress = mysql_result($result, 0, 'progress'); $queue = mysql_result($result, 0, 'queue'); if ($queue == '') $queue = NULL; else $queue = explode(';', $queue); return true; } function removeSession($sessionID) { $query = "DELETE FROM `" . DOWNLOADS_TABLE . "` WHERE sessionID='$sessionID'"; mysql_query($query); } ?> |
Wat WEL werkt:
de download starten met dl.php, naar phpMyAdmin gaan, en daar zie ik duidelijk dat de waarden zijn toegevoegd, en regelmatig geupdated worden. Dus phpMyAdmin heeft een bepaalde manier van werken die precies doet wat ik zou willen...
Wat ik al geprobeerd heb:
- In plaats van mysql_connect() de variant mysql_pconnect, met de hoop dat het mss via dezelfde verbinding wel zou lukken
- In dl.php na elke query de verbinding te sluiten (en dus telkens terug te openen wanneer dat nodig was). Dit was niet alleen trager, maar hielp ook niet...
- De parameter new_link op true gezet bij mysql_connect, om mysql te verplichten een 2de verbinding te maken... Hielp niet.
Dus wat ik jullie zou willen vragen: Hoe verhelp ik dit? Oh, en alle tips zijn welkom betreffend de code, om bijvoorbeeld dingen te versnellen
Dank bij voorbaat!
PS: zoals jullie wrsch al gemerkt hebben, deze code is niet volledig af (dl.php zou voor meerdere bestanden moeten werken, enz...)
Edit:
Opgelost, zie verder
[ Voor 26% gewijzigd door djbe op 17-08-2005 17:34 . Reden: Opgelost ]