Здравствуйте, не могу найти в инете ответ на простой вроде вопрос. Задался тут вдруг таким вопросом. Как сервер обрабатывает одновременно тысячи запросов от браузеров? Ставит их в очередь? На примере: Существует скрипт капчи, в определенном месте он инклюдится и генерирует изображение. В целях безопасности напрямую (в тег <img>) не прописывается, а создает сначала файл-картинку: kapcha.jpg, а уже она потом прописывается в <img>. В конце концов, после благополучного ее создания она выводится в браузер. Эта картинка для всех имеет одинаковое имя kapcha.jpg, создается капчей в одном и том же месте (правда имеет хвост ?rand() для борьбы с собственным куком), когда 1000 пользователей заходят на сайт, чтоб сгенерировать капчу...она проходит всю туже схему...каждая последующая затирает предыдущую ...(названия же одинаковые), что делает сервер??? 510 запрос ждет, пока предыдущие 509 создадут свою kapcha.jpg и затрут предыдущую kapcha.jpg, чтоб вывести их на экран? Или одновременно выполняются десятки, сотни запросов?...но ведь место на файле с этим именем и расширением одно? Не могу понять принцип работы. Даже если это происходит очень быстро...
обычно картинка это замаскированный файл того же пхп, и никакого сохранения картинки нету. Ибо тогда она при одновременном запросе будет одинаковой =) полюбас
но она сначала генерируется скриптом, тут же копируется и тут же выводится в браузер...в одновременный запросе все равно, должна создаться своя картинка...
Согласен. У PHP есть функции генерации изображений, а имея хорошее воображение, можно такого напридумывать) Картинки этой может даже и не существовать на сервере, либо существовать, но только фоном для цифр и букв на ней.
kaptcha.jpg - обычно это php-скрипт, который генерирует картинку. Web-сервер имеет лимит одновременных соединений. Когда достигается лимит, новый запрос на соединение отвергается. Браузер посылает несколько запросов, и если так и не удается соединиться, выводит ошибку что сервер недоступен. В пределах этого лимита операции выполняются параллельно, например если 100 браузеров одновременно запросили index.php, этот скрипт будет запущен 100 раз одновременно.
Парни вы не поняли... можно конечно сделать kapcha.php...переимновать его в kapcha.jpg и вставить в <img src='kapcha.jpg' /> причем само собой в kapcha.php будет генерироваться картинка, рисоваться, а не копироваться с каког-нибудь место...
Хорошо я понял... Если это не будет скрипт, а скрипт будет в одном месте, картинка в другом. Как себя будет вести сервер? Будет успевать вывести ее в браузер юзеру "А" до того как ее затрет юзер "В" ?????
htaccess ну не специально же он ее затрет, а потому, что создаст свою картинку...которую тут же на экран выведет браузер.
Если скрипт при каждом запуске перезаписывает файл с каптчей, то да, может быть так, что пользователь увидит не "свою" каптчу, а каптчу предназначеную для другого пользователя, который сделал запрос на миллисекунду позже. Браузер для каждой картинки посылает отдельный запрос. Пока этот запрос отправится, будет получен и обработан, теоретически, каптча может перезаписаться хоть сто раз.
A.B.C. возможно и не будет. вы все правильно понимаете, и ситауция будет развиваться именно так как вам кажется - кто-то может получить не свою картирку. именно поэтому: http://www.php.ru/forum/viewtopic.php?p=280861#280861
htaccess я это вроде все умею...и написал капчу, которая рисует, а вы не могли бы подсказать, как замаскировать kapcha.php, например под картинку? Чтоб в исходном коде не видно было строки типа HTML: <img src="kapcha.php" /> ???
Никогда этим не занимался, но могу поделиться функцией, которая отдаёт файл на скачку с поддержкой докачки, там есть заголовки, которые потребуются. Код (Text): <?php set_time_limit(0); function file_download($filename, $mimetype='audio/mpeg') { $download_speed = 51200; // 51200 $time_discret = 1; if (file_exists($filename)) { $f = fopen($filename, 'r'); if (isset($_SERVER['HTTP_RANGE'])) { $load_from = preg_replace('#[^0-9]#', '', $_SERVER['HTTP_RANGE']); fseek($f, $load_from); $filesize = filesize($filename); header('HTTP/1.1 206 Partial Content'); header('Content-Type: ' . $mimetype); header('Content-Range: bytes '.$load_from.'-'.$filesize.'/'.$filesize); header('Last-Modified: ' . gmdate('r', filemtime($filename))); header('ETag: ' . sprintf('%x-%x-%x', fileinode($filename), filesize($filename), filemtime($filename))); header('Accept-Ranges: bytes'); header('Content-Length: ' . (filesize($filename))); header('Connection: close'); header('Content-Disposition: attachment; filename="' . basename($filename) . '";'); } else { header($_SERVER["SERVER_PROTOCOL"] . ' 200 OK'); header('Content-Type: ' . $mimetype); header('Last-Modified: ' . gmdate('r', filemtime($filename))); header('ETag: ' . sprintf('%x-%x-%x', fileinode($filename), filesize($filename), filemtime($filename))); header('Content-Length: ' . (filesize($filename))); header('Connection: close'); header('Content-Disposition: attachment; filename="' . basename($filename) . '";'); } if((int) $download_speed > 0) { while(!feof($f)) { $time_start = microtime(true); echo fread($f, ceil($download_speed*$time_discret)); flush(); $time_end = microtime(true); $time = $time_end - $time_start; if($time_discret-$time > 0) usleep(($time_discret-$time)*1000000); } } else { while(!feof($f)) { echo fread($f, 1024); flush(); } } fclose($f); } else { header($_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found'); header('Status: 404 Not Found'); } exit; } # file_download('./20_dt8_project.mp3', $mimetype='audio/mpeg'); ?>
A.B.C. дали ж вроде ссылку. Задача - отдать браузеру заголовок, что сейчас будет картинка, потом отдать в поток данные. Никакой картинки не создается. Можно данные обычным echo вывести, перед этим заголовок послать image/jpg. И браузер выведет картинку.
tommyangelo Я так понимаю это всего пара строчек..вы можете показать пример: <img src='kapcha.php' />
tommyangelo Спасибо...но не подменяет заголовки почему то...даже их пример скачал все равно кажет название скрипта в исходнике...