<?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');
<?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);
<?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);
Можно было в таком случае просто отключить вывод ошибок
// true - файл еще существует
$exsits = file_exists($path);
// Кто-то другой удалил файл
// Словим warning
$data = file_get_contents($path);
То, что показывает топ, можно попробовать найти в /proc, но на самом деле, кроме user/system там также считается wa, hi, si, st. Поэтому просто процент еще не означает именно нагрузку на процессор. Это как раз может быть нагрузка на дисковую систему или другие устройства.
Я рад, что мы пришли к консенсусу в этой напряженной дискуссии.
Если зайти в любое облако, вы увидите кучу других подобных услуг - базы, различные сервера приложений, веб сервера, услуги для расчета, для очереди сообщений и так далее. Потому что это удобно, и это ГОРАЗДО ДЕШЕВЛЕ, чем целый виртуальный сервер как для клиента так и для хостера. Поэтому, если у вас изначально вопрос заключался в экономии финансов, то стоит рассмотреть услугу хостинга, если она подходит по ресурсам.
Современные тренды уходят потихоньку от аренды виртуальных серверов, и переходят в сторону аренды конкретных услуг, или контейнеров. А виртуальные сервера - либо для уникальных ситуаций, либо когда нужно универсальное решение
При чем тут шлакосерверы?
У всех разные сервера. Поэтому разные VDS 30gb ssd, 2 ядра, 2 гига оперативки могут отличаться по производительности на порядок.