ultimo registro recien primer obtener last insertado php apache logging

php - recien - obtener ultimo registro insertado laravel



Acceda al registro en PHP (10)

Cree un auto_prepend_file y defina una función para registrar w / e que desee. Necesitarás acceso a .htaccess para configurarlos (y el servidor web necesitará algo como AllowOverride all en el vhost) o con PHP 5.3 puedes usar la función INI por directorio .

.htaccess

php_value auto_prepend_file /path/to/file.php

por directorio php.ini (PHP 5.3 CGI / Fast CGI SAPI)

user_ini.auto_prepend_file = /path/to/file.php

Luego, para su archivo /path/to/file.php (algo más elegante, estoy seguro;))

file_put_contents( LOG_FILE, implode(PHP_EOL . PHP_EOL, array( ''SERVER: '' . PHP_EOL . print_r($_SERVER, true), ''REQUEST: '' . PHP_EOL . print_r($_REQUEST, true) )), FILE_APPEND );

La belleza de este enfoque es que probablemente pueda salirse con la suya y solo necesitará definir / incluir el código de registro en un solo lugar.

EDITAR:

Tras la retrospección, veo que quieres que esto funcione para tipos de archivos arbitrarios ... Sí, eso sería bastante difícil. La mejor apuesta que puedo pensar es etiquetar estos archivos como .php o definir tipos de mime personalizados en .htaccess. La idea sería ejecutar los archivos a través del intérprete de PHP, ejecutando así el auto_prepend_file y como no hay etiquetas PHP en el archivo, el contenido se envía directamente al cliente. Tal vez incluso un poquito de PHP encima de cada archivo de contenido configurando el encabezado ContentType . Ni siquiera estoy seguro de que eso funcione, pero podría ser.

Quiero registrar el acceso a cualquier archivo en la carpeta /files , así que puedo procesarlo con PHP para generar algunas estadísticas.

No quiero escribir un controlador PHP personalizado llamado a través de RewriteRule porque no quiero tener que lidiar con códigos de estado, tipos MIME y encabezados de almacenamiento en caché, y problemas de bloqueo de archivos.

No tengo acceso a la configuración del servidor, así que no puedo usar CustomLog (tengo acceso a .htacess ).

No puedo usar X-Sendfile porque no está habilitado.

No tengo acceso al access.log .

Buscando una respuesta autoritaria.


Es bastante fácil de hacer teniendo en cuenta que no necesita restringir el acceso.

construye una página logger.php que toma en entrada el archivo solicitado como:

logger.php?file=abc.exe

En logger.php solo tienes que iniciar sesión en este acceso y luego redireccionar al archivo:

file_put_contents(''log'', $_GET[''file''] . '' requested'',FILE_APPEND); header(''Location: files/''.$_GET[''file'']);

Solo revisa $_GET[''file''] para encontrar archivos maliciosos

Por supuesto, debe reemplazar los enlaces en su sitio, desde:

<a href="files/abc.exe">

a

<a href="logger.php?file=abc.exe">


Esas son unas pocas restricciones que ha colocado allí.

Puede hacer esto con un controlador personalizado instalado a través de un PHP include en la parte superior de cada script aplicable (o, con __FILE__ análisis, no aplicable). Debe tener un script que se ejecute cuando se golpea cada archivo , y usted ha excluido las alteraciones en la configuración del servidor (incluido, creo, .htaccess cuando dijo que RewriteRule no era lo suficientemente bueno), lo que significa que estará haciendo esto a través de un controlador de acceso basado en script. No puede tener una solución que cumpla con sus limitaciones y los usuarios deben ir a archivos sin tocar PHP (u otro lenguaje dinámico del lado del servidor) primero. El almacenamiento en caché se puede conservar redireccionando al usuario a los archivos reales en lugar de ejecutar contenido estático a través de PHP.

Puede almacenar la información de registro en una base de datos, o un archivo en una ubicación que puede escribir el servidor (tenga cuidado con la disputa si usa archivos: el modo de agregar es complicado).

EDITAR: quickshiftin señala dos maneras en que puede obtener PHP invocado sin tener que agregar llamadas de include a mano.


Funciona solo en el caso mod_php. Hay algún golpe de rendimiento: apache_lookup_uri () hace una sub-solicitud interna adicional de apache.

Como otros señalaron, necesitas .htaccess como

RewriteEngine On RewriteRule ^/handler.php$ - [L] RewriteRule ^/([a-zA-Z0-9/.]+)$ /handler.php?filename=$1 [L]

En el archivo handler.php, use la función virtual () para realizar una subpetición de Apache. Ejemplo aquí: http://www.php.net/manual/en/function.virtual.php#88722

Solución actualizada y probada (pero bastante mínima):

<?php //add some request logging here $file = $_GET["filename"]; $file_info = apache_lookup_uri($file); header(''content-type: '' . $file_info -> content_type); // add other headers? virtual($file); exit(0); ?>


He intentado muchas cosas y parece que no hay una solución fácil.

Mi solución usa el truco del encabezado de Location propuesto por @ yes123 pero lo modifiqué para que coincida con mis preferencias.

Los enlaces a los archivos se mantienen intactos, por lo que sigue siendo: /files/path/to/my/file.abc Tengo una RewriteRule :

RewriteRule ^files/(.*) path/to/tracker.php?path=/$1

Luego, en el archivo, publico un encabezado de Location al agregar ?track=no a la URL y una excepción a RewriteRule anterior:

RewriteCond %{QUERY_STRING} !(&|^)track=no(&|$)

He agregado una optimización más. He habilitado E-Tags para que si el cliente envía un encabezado de E-Tag, vea si coincide con el archivo y devuelva un 304 Not Modified lugar de una Location .

$fs = stat($document_root . $path); $apache_etag = calculate_apache_etag($fs); if ((isset($_SERVER["HTTP_IF_MATCH"]) && etag_within_range($_SERVER["HTTP_IF_MATCH"], $apache_etag)) || (isset($_SERVER["HTTP_IF_NONE_MATCH"]) && etag_within_range($_SERVER["HTTP_IF_NONE_MATCH"], $apache_etag)) ) { header("ETag: " . $apache_etag, true, 304); exit; } function etag_within_range($etag1, $etag2) { list($size1, $mtime1) = explode("-", $etag1); list($size2, $mtime2) = explode("-", $etag2); $mtime1 = floor(hexdec($mtime1) / 1000000); $mtime2 = floor(hexdec($mtime2) / 1000000); return $mtime1 === $mtime2 && $size1 === $size2; }

Y la implementación de calculate_apache_etag se puede encontrar aquí: ¿Cómo se hace un etag que coincida con Apache?

etag_withing_range resuelve el problema de comparar con un mtime mayor precisión en Apache.

Notas sobre soluciones que no funcionaron

virtual

Secuencia de comandos de prueba:

var_dump(apache_response_headers()); virtual("/path/to/image.jpg"); var_dump(apache_response_headers());

Productos:

array(1) { ["X-Powered-By"]=> string(10) "PHP/5.2.11" } [[binary junk]] array(5) { ["X-Powered-By"]=> string(10) "PHP/5.2.11" ["Keep-Alive"]=> string(18) "timeout=5, max=100" ["Connection"]=> string(10) "Keep-Alive" ["Transfer-Encoding"]=> string(7) "chunked" ["Content-Type"]=> string(9) "text/html" }

Content-Type: text/html reaaaaalllly ? :(

¿Quizás la función header_remove de header_remove puede resolver esto? No lo he intentado.


La única supervisión discreta que podría hacer sin filtrar cosas a través de PHP sería verificar todos los archivos y anotar sus tiempos de acceso a los archivos cada vez que se solicite un archivo PHP (simplemente agregue una función a sus archivos php o use una reescritura). Se incurrirá en un poco de gastos generales, pero es la única estadística discreta que puede obtener.

Obviamente, de esta manera no se pueden obtener números exactos de accesos, sino más bien frecuencias similares, por lo que también es una especie de estadística (viable). Para obtener algo así como números de aciertos (esto se abrió 1000 veces el 25 de marzo a las 2 a.m.) necesitas tener acceso a los registros o canalizarlo todo a través de un script de PHP o CGI; algo solo tiene que hacer el recuento manual.


OK, aquí hay una idea. Tenga paciencia conmigo en esto, al principio puede parecer inadecuado, pero lea el bit al final. Espero que funcione con lo que tienes en su lugar. En la carpeta que contiene sus archivos, coloca un .htaccess que reescribe todas las solicitudes a un script de controlador de PHP en el mismo directorio, algo como esto (no probado):

RewriteEngine On RewriteRule ^/handler.php$ - [L] RewriteRule ^/([a-zA-Z0-9/.]+)$ /handler.php?filename=$1 [L]

En el script PHP, haces lo que sea necesario para el file_put_contents() usando file_put_contents() . Luego, creas handler.php con este código:

<?php if (!file_exists) { header("Status: 404 Not Found"); //if you have a 404 error page, you can use an include here to show it exit(0); } header("Content-disposition: attachment; filename={$_GET["filename"]}"); header("Content-type: ".get_mime_type($_GET["filename"])); readfile($filename); function get_mime_type($filename, $mimePath = ''/etc'') { $fileext = substr(strrchr($filename, ''.''), 1); if (empty($fileext)) return (false); $regex = "/^([/w/+/-/.//]+)/s+(/w+/s)*($fileext/s)/i"; $lines = file("$mimePath/mime.types"); foreach($lines as $line) { if (substr($line, 0, 1) == ''#'') continue; // skip comments $line = rtrim($line) . " "; if (!preg_match($regex, $line, $matches)) continue; // no match to the extension return ($matches[1]); } return (false); // no match at all } ?>

Básicamente, está creando una capa entre la solicitud del archivo y la porción real del archivo. Esta capa PHP registra el acceso al archivo y luego sirve el archivo. Dijiste que no querías perder el tiempo con los códigos de estado y los tipos MIME, pero la belleza de esto es que todo eso se soluciona. En caso de que el archivo no exista, solo genera un 404 estándar, y puede incluir una página de error 404 personalizada. Sí, el encabezado de estado se está cambiando aquí, pero no es nada complicado. En cuanto a los tipos MIME, se detectan de acuerdo con las mismas reglas de tipo MIME que usa Apache. Apunte la función get_mime_type al archivo mime.types en su servidor. Si no sabe dónde está, solo descargue una copia desde aquí . Debo admitir que esta solución es probablemente más técnica de lo que estaba buscando, pero con las restricciones que tiene es una buena solución. La mejor parte es que es completamente transparente para el usuario final, así como para aquellos que cargan cosas.


Parece que la intención aquí es eludir todos los sistemas que están inherentemente en su lugar en Apache y PHP. Si estas restricciones están vigentes en su instancia de servidor, es mucho mejor que solicite un cambio en sus privilegios que idear una solución alternativa que el administrador del sistema pueda o no estar conforme con su implementación.


Puede que no sea exactamente lo que quieres, pero ¿por qué no utilizas una solución diferente por completo?

Puede usar Google Analytics VirtualPageviews para rastrear las descargas de archivos a través de Javascript.

Consulte aquí para obtener más información: http://support.google.com/googleanalytics/bin/answer.py?hl=es&answer=55529

Incluso podría crear su propio JS para rastrear las descargas de archivos a través del navegador sin tener que preocuparse por GA.

Actualización :

Como dije, puedes crear fácilmente tu propio JS para rastrearlos sin tener que molestarte con GA. Aquí hay un ejemplo tonto en jQuery que funcionaría (no lo he probado, simplemente lo escribí de la parte superior de mi cabeza):

Muestra de código:

JS Side:

$(document).ready(function() { $("a").click(function() { if( $(this).attr(''href'').match(///files//(.*)/) ) { $.ajax({ url: ''/tracking/the/file/downloads.php'' data: { ''ok'': ''let/'s'', ''add'': ''some information'', ''about'': ''the user that initiated'', ''the'': ''request'', ''file'': $(this).attr(''href'') } }); } return true; }); });