jejeje de eso me di cuenta hace poco creo que voy por muy buen camino.... además es bueno tener el log de errores vació se ve mas elegante
... Si a mi me gusta usar los dos isset y empty uno verifico que la variable este definida y no este nula y segundo verifico que no este vacía para que quiero comprobar algo vació además evito el error. El referer puede venir vació o nulo si el usuario por ejemplo ingresa al sitio web directamente desde una pestaña nueva o hace un curl sin referer....
En cuanto al tema de los errores un caso por ejemplo digamos que tenemos que borrar un archivo:
unlink($archivo_borrar);
Y en la documentación dice
https://www.php.net/manual/es/function.unlink.php dice que existe la posibilidad de que se genere un error por x o y motivo... puede ser del sistema operativo, que el archivo este ocupado por otro recurso o no se por que otro...
Se generará un error de nivel E_WARNING si se produce un error.
Lo más común seria primero entonces verificar que el archivo existe con file_exists pero también en la documentación
https://www.php.net/manual/es/function.file-exists.php nos dice...
En caso de fallo, se emite un E_WARNING.
Aun así mirando el la documentación
https://www.php.net/manual/es/errorfunc.constants.php ese
E_WARNING
E_WARNING - Advertencias en tiempo de ejecución (errores no fatales). La ejecución del script no se interrumpe.
En este caso es algo que no controlamos puede generarse un error en cualquier momento y pues creo que se mostraría en el log, aun así es poco probable que ocurra pero puede pasar cuando hay concurrencia...
Lo del arroba @ según leo ignora los errores, no los imprime pero están presentes es bueno saber que pasa para aprender...
Finalmente como conclusión con esto de la concurrencia lo aprendí alguna vez que necesitaba un sistema de cache y encontré este:
Caché simple basada en archivos para PHP | Simple PHP file cache - emilio/php-cache
github.com
El lió inicialmente fue que al existir muchos procesos en concurrencia al leer o guardar una clave se generaban datos corruptos
Pueden ver los test que hicieron en la carpeta: legacy-tests
Y aquí pueden leer todo el proceso realizado es impresionante:
https://www.logicaalternativa.com/p...ento-sobre-cache-y-simple-cache-en-php-y-mas/
La solución la encontraron de esta forma ingresen a Cache/Cache.php en la función put(
PHP:
public static function put($key, $content, $raw = false)
{
$dest_file_name = self::getRoute($key);
/** Use a unique temporary filename to make writes atomic with rewrite */
$temp_file_name = str_replace(".php", uniqid("-", true).".php", $dest_file_name);
$ret = @file_put_contents($temp_file_name, $raw ? $content : serialize($content));
if ($ret === false) {
@unlink($temp_file_name);
return false;
}
return @rename($temp_file_name, $dest_file_name);
}
Mirando en la documentación me llamo la atención la función rename
https://www.php.net/manual/en/function.rename.php
Un comentario dice Note, that on Unix, a rename is a beautiful way of getting atomic updates to files
I am not being able to check this via experiments and could not gather it from the man pages as well. Say I have two processes, one moving(rename) file1 from directory1 to directory2. Say the other
stackoverflow.com
Buscando en wikipedia:
Una operación atómica es una operación en la que un procesador puede simultáneamente leer una ubicación y escribirla en la misma operación del bus. Esto previene que cualquier otro procesador o dispositivo de E/S escriba o lea la memoria hasta que la operación se haya completado.
El término atómico implica la indivisibilidad e irreductibilidad del proceso, ya que éste debe realizarse en su totalidad o en caso de ser interrumpido poder deshacer sus acciones de modo que fuese como si no se hubiese realizado acción alguna.
Fantástica solución!!!
Me pregunto si W3 Total Cache y otros sistemas de cache de archivos tienen implementado esto, la verdad no lo se pero es muy interesante pues a la final lo más importante son los usuario que nos dan el dinero y no me gustaría que alguno se le impriman datos erróneos o vacíos...
Creo que me perdí un poco del tema principal...
Estos errores creo que se podrían generar en muchas funciones unlink, file_put_contents...