Php очистить экран браузера
Для обеспечения большей производительности при использовании функций stat() , lstat() или любой другой функции, перечисленных в приведённом ниже списке, PHP кеширует результаты их выполнения. Однако, в некоторых случаях вам может потребоваться очистка этого кеша. Например, когда ваш скрипт несколько раз проверяет состояние одного и того же файла, который может быть изменён или удалён во время выполнения скрипта, вы можете захотеть очистить кеш состояния. В этом случае необходимо использовать функцию clearstatcache() для очистки в PHP кешированной информации об указанном файле.
Обратите внимание, что PHP не кеширует информацию о несуществующих файлах. Так что, если вы вызовете file_exists() на несуществующем файле, она будет возвращать false до тех пор, пока вы не создадите этот файл. Если же вы создадите файл, она будет возвращать true , даже если затем вы его удалите. Однако, функция unlink() очистит данный кеш автоматически.
Замечание:
Данная функция кеширует информацию об определённых файлах, поэтому имеет смысл вызывать clearstatcache() только в том случае, если вы совершаете несколько операций с одним и тем же файлом и не хотите получать кешированную информацию об этом файле.
Список параметров
Очищать кеш realpath или нет.
Очистить кеш realpath и stat только для определённого файла, используется только если параметр clear_realpath_cache установлен в true .
Возвращаемые значения
Функция не возвращает значения после выполнения.
Примеры
function get_owner ( $file )
$stat = stat ( $file );
$user = posix_getpwuid ( $stat [ 'uid' ]);
return $user [ 'name' ];
>
$format = "UID @ %s: %s\n" ;
printf ( $format , date ( 'r' ), get_owner ( $file ));
chown ( $file , 'ross' );
printf ( $format , date ( 'r' ), get_owner ( $file ));
clearstatcache ();
printf ( $format , date ( 'r' ), get_owner ( $file ));
?>
Результатом выполнения данного примера будет что-то подобное:
User Contributed Notes 7 notes
unlink() does not clear the cache if you are performing file_exists() on a remote file like:
<?php
if ( file_exists ( "ftp://ftp.example.com/somefile" ))
?>
In this case, even after you unlink() successfully, you must call clearstatcache().
Note that this function affects only file metadata. However, all the PHP file system functions do their own caching of actual file contents as well. You can use the "realpath_cache_size = 0" directive in PHP.ini to disable the content caching if you like. The default content caching timeout is 120 seconds.
Content caching is not a good idea during development work and for certain kinds of applications, since your code may read in old data from a file whose contents you have just changed.
Just to make this more obvious (and so search engines find this easier):
If you do fileops of any kind outside of PHP (say via a system() call), you probably want to clear the stat cache before doing any further tests on the file/dir/whatever. For example:
<?php
// is_dir() forces a stat call, so the cache is populated
if( is_dir ( $foo ) ) system ( "rm -rf " . escapeshellarg ( $foo ));
if( is_dir ( $foo ) ) // . will still be true, even if the rm succeeded, because it's just
// reading from cache, not re-running the stat()
>
>
?>
Pop a clearstatcache() after the system call and all is good (modulo a bit of a performance hit from having a cleared stat cache :-( ).
Not documented, but seems like clearstatcache() is clearing the cache only for the process it is being called from. I have 2 PHP scripts running simultaneously, and the first one does call clearstatcache(), but still the second one deadlocks, unless I call clearstatcache() in it too:
Definition of $filename parameter let's you think that it expects the filename only but it works if you give the path + filename also.
It should be more clear about this.
On Linux, a forked process inherits a copy of the parent's cache, but after forking the two caches do not impact each other. The snippet below demonstrates this by creating a child and confirming outdated (cached) information, then clearing the cache, and getting new information.
if ( is_dir ( $target )) die( "Delete $target before running.\n" );
>
echo "Creating $target .\n" ;
mkdir ( $target ) || die( "Unable to create $target .\n" );
report ( $target ); // is_dir($target) is now cached as true
echo "Unlinking $target .\n" ;
rmdir ( $target ) || die( "Unable to unlink $target .\n" );
// This will say "yes", which is old (inaccurate) information.
report ( $target );
if (( $pid = pcntl_fork ()) === - 1 ) < die( "Failed to pcntl_fork.\n" ); >
elseif ( $pid === 0 ) // child
report ( $target , '<<child>> ' );
echo "<<child>> Clearing stat cache.\n" ;
clearstatcache ();
report ( $target , '<<child>> ' );
> else // parent
sleep ( 2 ); // move this to the child block to reverse the test.
report ( $target , '<<<parent>> ' );
clearstatcache ();
report ( $target , '<<<parent>> ' );
>
Для обеспечения большей производительности при использовании функций stat() , lstat() или любой другой функции, перечисленных в приведенном ниже списке, PHP кеширует результаты их выполнения. Однако, в некоторых случаях вам может потребоваться очистка этого кеша. Например, когда ваш скрипт несколько раз проверяет состояние одного и того же файла, который может быть изменен или удален во время выполнения скрипта, вы можете захотеть очистить кеш состояния. В этом случае необходимо использовать функцию clearstatcache() для очистки в PHP кешированной информации об указанном файле.
Обратите внимание, что PHP не кеширует информацию о несуществующих файлах. Так что, если вы вызовете file_exists() на несуществующем файле, она будет возвращать false до тех пор, пока вы не создадите этот файл. Если же вы создадите файл, она будет возвращать true , даже если затем вы его удалите. Однако, функция unlink() очистит данный кеш автоматически.
Замечание:
Данная функция кеширует информацию об определенных файлах, поэтому имеет смысл вызывать clearstatcache() только в том случае, если вы совершаете несколько операций с одним и тем же файлом и не хотите получать кешированную информацию об этом файле.
Список параметров
Очищать кеш realpath или нет.
Очистить кеш realpath и stat только для определенного файла, используется только если параметр clear_realpath_cache установлен в true .
Возвращаемые значения
Эта функция не возвращает значения после выполнения.
Примеры
function get_owner ( $file )
$stat = stat ( $file );
$user = posix_getpwuid ( $stat [ 'uid' ]);
return $user [ 'name' ];
>
$format = "UID @ %s: %s\n" ;
printf ( $format , date ( 'r' ), get_owner ( $file ));
chown ( $file , 'ross' );
printf ( $format , date ( 'r' ), get_owner ( $file ));
clearstatcache ();
printf ( $format , date ( 'r' ), get_owner ( $file ));
?>
Ситуация следующая: был сайт www.mysite.com оставил много разных куков, кэшированных картинок и стилей css. Сайт обновился, но кэшированная информация у пользователей мешает нормальной работе (особенно google chrome 29). Если отчистить историю+кэш+куки всё отлично начинает работать. Можно ли как то принудительно при первом заходе заставить браузер удалить информацию по этому сайту, а далее уже кэшировать "как всегда"?
7,130 4 4 золотых знака 26 26 серебряных знаков 49 49 бронзовых знаков Я читал про это, в таком случае он не будет кэшироваться вообще, а мне в идеале хотелось бы "отчистить" а потом кэшировать как всегда Пройдитесь по домам ваших посетителей и почистите тогда им кэш :) Как вы представляете себе - все пользователи зайдут к вам одновременно в тот период, когда у вас сервер будет отдавать эти хедеры? Раскиньте мозгами - "маркируйте" очищенных с помощью куков - зашел пользователь? Зашел. Есть кука? Нет. Тогда получи с хедером и поставь новую "маркер"-куку. Следующий раз зайдет - проверяйте "маркер"-куку. Есть? Отлично - не шлите больше хедеров. Продержите такое на время, пока не почувствуете, что пора завязывать с этим механизмом и все "проапдейтились".Или слать header в страницах (как-то в таком стиле)
3,530 14 14 серебряных знаков 27 27 бронзовых знаковУ вас, это то не беда, чтоб на сайте отображались css правильно (как я понял вы его меняете периодически и это ломает отображение сайта) надо всего лишь сделать все время новый адрес загрузки css вот так:
и все браузер будет думать что файл css все время новый и верстка ломаться не будет
а вот у меня другая проблема, на сайте есть авторизация и иногда случается что на некоторые страницы (закрытые не авторизованным пользователям) зайти не получается, дело в том, что браузер в этих случаях даже и не пытается проверить авторизацию и сразу выкидывает на главную, как не аторизованного пользователя. Причем если очистить кеш браузера сразу все работает правильно!
я уже кучу сайтов с авторизацией сделал и такого ниразу не встречал, что мне делать? я просто в шоке.
Эта функция удаляет содержимое самого верхнего буфера вывода и отключает эту буферизацию. Если вы хотите использовать содержимое буфера, то вам необходимо вызвать ob_get_contents() перед ob_end_clean() , так как все содержимое буфера удаляется при вызове ob_end_clean() .
Буфер вывода должен запускаться функцией ob_start() с флагами PHP_OUTPUT_HANDLER_CLEANABLE и PHP_OUTPUT_HANDLER_REMOVABLE. Иначе не сработает ob_end_clean() .
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Основной причиной неудачного завершения работы функции является её вызов без активного буфера или если буфер не может быть удалён (специальный тип буфера).
Ошибки
Если функция завершается ошибкой, генерируется E_NOTICE .
Примеры
Следующий пример показывает простой способ избавиться от всех выходных буферов:
<?phpob_start ();
echo 'Текст, который не отобразится.' ;
ob_end_clean ();
?>
Смотрите также
User Contributed Notes 12 notes
Take note that if you change zlib output compression setting in between ob_start and ob_end_clean or ob_end_flush, you will get an error: ob_end_flush() failed to delete buffer zlib output compression
ini_set ( 'zlib.output_compression' , '1' );
?>
ob_end_clean(); in this example will throw the error.
Note that if you started called ob_start with a callback, that callback will still be called even if you discard the OB with ob_end_clean.
Because there is no way of removing the callback from the OB once you've set it, the only way to stop the callback function from having any effect is to do something like:
<?php
$ignore_callback = false ;
ob_start ( 'my_callback' );
.
if( $need_to_abort ) $ignore_callback = true ;
ob_end_clean ();
.
>
function my_callback (& $buffer ) if( $GLOBALS [ 'ignore_callback' ]) return "" ;
>
.
>
?>
If there is no confidence about output buffering (enabled or not),
you may try these guards:
while ( ob_get_level () !== 0 ) ob_end_clean ();
>
while ( ob_get_length () !== false ) ob_end_clean ();
>
echo "<p>Search running. Please be patient. . .";
$output = "<p>FileList: </p>\n";
if (is_dir($dir)) $dh = opendir($dir);
while (($fd = readdir($dh)) != false) echo " .";
$output .= $fd;
>
>
echo "</br>Search Complete!</p>\n";
echo $output;
1. Call ob_gzhandler().
2. Echo "Some content";
3. Call ob_end_clean().
4. Echo "New content";
In the above case, the browser may receive the "Content-Encoding: gzip" HTTP header and attempts to decompress the uncompressed "New content". The browser will fail.
In the following situation, this behaviour will go unnoticed:
1. Call ob_gzhandler().
2. Echo "Some content";
3. Call ob_end_clean().
4. Call ob_gzhandler().
5. Echo "New content";
This is because the second ob_gzhandler() will mask the absence of the first ob_gzhandler().
A solution would be to write a wrapper, like John Smith did, for the ob_gzhandler().
You might want to prevent your script from executing if the client already has the latest version.
You can do it like so:
$mtime=filemtime($_SERVER["SCRIPT_FILENAME"])-date("Z");
$gmt_mtime = date('D, d M Y H:i:s', $mtime) . ' GMT';
if(isset($headers["If-Modified-Since"])) if ($headers["If-Modified-Since"] == $gmt_mtime) header("HTTP/1.1 304 Not Modified");
ob_end_clean();
exit;
>
>
$size=ob_get_length();
header("Last-Modified: ".$gmt_mtime);
header("Content-Length: $size");
ob_end_flush();
Instead of checking the If-Modified-Since-Header against the date of the last modification of the script, you can of course query a database or take any other date that is somehow related to the modification of the result of your script.
You can for instance use this technique to generate images dynamically. If the user indicates he already has a version of the image by the If-Modified-Since-Header, there's no need to generate it and let the server finally discard it because the server only then interpretes the If-Modified-Since-Header.
This saves server load and shortens response-times.
Notice that ob_end_clean() does discard headers.
If you would like to clear the output buffer, but not the headers (because you use firephp for example. ), than this is the solution:
$headers = array();
if ( ! headers_sent () ) $headers = apache_response_headers ();
>
if ( !empty( $headers ) ) foreach ( $headers as $name => $value ) header ( " $name : $value " );
>
>
.
?>
I use it in a general exception handler in a web application, where I clear the buffer (but not the debug-info-containing headers), and send a 500 error page with readfile().
This may be posted elsewhere, but I haven't seen it.
To run a progress indicator while the program is running without outputting the output buffer, the following will work:
echo "<p>Search running. Please be patient. . .";
$output = "<p>FileList: </p>\n";
if (is_dir($dir)) $dh = opendir($dir);
while (($fd = readdir($dh)) != false) echo " .";
ob_start();
echo $fd;
$output .= ob_get_contents();
ob_end_clean();
>
>
echo "</br>Search Complete!</p>\n";
echo $output;
The program will continue to print the " ." without printing the file list. Then the "Search Complete" message will print followed by the buffered file list.
About the previous comment:
You can also relay on ETag and simply use time()
<?php
$time = time ();
$mins = 1 ;
if (isset( $_SERVER [ 'HTTP_IF_NONE_MATCH' ]) and str_replace ( '"' , '' , $_SERVER [ 'HTTP_IF_NONE_MATCH' ])+( $mins * 60 ) > $time )
header ( 'HTTP/1.1 304 Not Modified' );
exit();
>
else
header ( 'ETag: "' . $time . '"' );
>
echo 'Caching for ' , $mins * 60 , 'secs<br/>' , date ( 'G:i:s' );
?>
In reference to <geoff at spacevs dot com> where he states, "If you call ob_end_clean in a function registered with 'register_shutdown_function', it is too late, any buffers will have already been sent out to the client.", here is a workaround I came up with.
function ClearBuffer ( $Buffer ) return "" ;
>
function Shutdown () ob_start ( "ClearBuffer" );
>
?>
This will wipe out all the contents of the output buffer as it comes in. Basically its the same as "STDOUT > /dev/null".
Читайте также: