$data = file_get_contents(__DIR__ . '/' . $value["Id"] . '.txt');
$data = json_decode($data, true);
// true - файл еще существует
$exsits = file_exists($path);
// Кто-то другой удалил файл
// Словим warning
$data = file_get_contents($path);
Можно было в таком случае просто отключить вывод ошибок
$content = @file_get_contents($filename);
$data = json_decode($content, true);
$content = @file_get_contents($filename);
if ($content !== false) {
$data = json_decode($content, true);;
} else {
// Обработка отсутствия файла
}
setErrorHandler(function () {
throw new MyError;
})
try{
$a = file_get_contents($path);
}catch(MyError $e){
// Отловили warning
}
// вернули предыдущий обработчик ошибок
restore_error_handler();
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
$filename = $i . '.txt';
$content = @file_get_contents($filename);
}
var_dump(microtime(true) - $start);
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
$filename = $i . '.txt';
if (file_exists($filename)) {
$content = file_get_contents($filename);
}
}
var_dump(microtime(true) - $start);
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
$filename = $i . '.txt';
set_error_handler(function(){
throw new \LogicException();
});
try {
$content = file_get_contents($filename);
} catch (\LogicException $e) {
}
restore_error_handler();
}
var_dump(microtime(true) - $start);
<?php
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
$filename = $i . '.txt';
$content = @file_get_contents($filename);
}
// float(8.7935888767242)
var_dump(microtime(true) - $start);
<?php
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
$filename = $i . '.txt';
if (file_exists($filename)) {
$content = file_get_contents($filename);
}
}
// float(5.4787609577179)
var_dump(microtime(true) - $start);
<?php
$start = microtime(true);
function read($filename)
{
set_error_handler(function(){
throw new \LogicException();
});
try {
return file_get_contents($filename);
} catch (\LogicException $e) {
throw $e;
}finally{
restore_error_handler();
}
}
for ($i = 0; $i < 100000; $i++) {
$filename = $i . '.txt';
try{
$content = read($filename);
}catch (\LogicException $e){
}
}
//float(9.6839311122894)
var_dump(microtime(true) - $start);
$start = microtime(true);
function read($filename)
{
set_error_handler(function () {});
try {
return file_get_contents($filename);
} finally {
restore_error_handler();
}
}
for ($i = 0; $i < 100000; $i++) {
$filename = $i . '.txt';
$content = read($filename);
}
// double(3.5031039714813)
var_dump(microtime(true) - $start);
<?php declare(ticks=3);
$start = microtime(true);
$test = __DIR__.'/.test';
register_tick_function(function () use ($test) {
unlink($test);
});
if(!is_file($test)){
file_put_contents($test, 'test');
}
for ($i = 0; $i < 100000; $i++) {
file_put_contents($test, 'test', FILE_APPEND);
if (file_exists($test)) {
$content = file_get_contents($test);
}
}
<?php
$start = microtime(true);
fclose(STDERR);
ob_start();
for ($i = 0; $i < 100000; $i++) {
$filename = $i . '.txt';
if (true) {
$content = file_get_contents($filename);
}
}
ob_end_clean();
var_dump(microtime(true) - $start);
<?php
$start = microtime(true);
function read($filename)
{
set_error_handler(function () {
throw new \Exception();
});
try {
if(is_file($filename)){
return file_get_contents($filename);
}
throw new \Exception();
} finally {
restore_error_handler();
}
}
for ($i = 0; $i < 100000; $i++) {
$filename = $i . '.txt';
try{
$content = read($filename);
}catch (\Throwable $e){
}
}
// float(5.6699061393738) - текущий, при втором варианте - float(5.537750005722)
var_dump(microtime(true) - $start);
function read($filename)
{
if (!is_file($filename)) {
throw new \Exception();
}
if (($content = @file_get_contents($filename)) === false) {
throw new \Exception(error_get_last()['message']);
}
return $content;
}
<?php
/*
* Обычно, хандлер работает по такой логике:
* debug = true - warning пишется в лог, ошибки не происходит
* debug = false - пишем в лог, выкидывем исключение
*/
define('DEBUG', false);
// где-то вдали
function framework_handler($code, $message){
// ...
// Пишем в лог
if(DEBUG){
throw new \Exception($message);
}
return true;
}
set_error_handler('framework_handler');
function read($filename)
{
if (($content = @file_get_contents($filename)) === false) {
var_dump('Last error: '.error_get_last());
}
return $content;
}
read(__DIR__.'/.none');
set_error_handler(function(){
return true;
});
Debug::enable()
) в Symfony error_get_last
работает корректно