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;
});
});
Suponiendo que está utilizando PHP como un módulo Apache compilado, entonces la función virtual () podría hacer que esto suceda. Ver: http://www.php.net/manual/en/function.virtual.php
<?php
$fn = $_GET[''fn''];
log_file_access($fn); // You define how you want this to happen
virtual($fn);
A continuación, hace referencia a los archivos a través de: