php - 如何在将 Apache 日志文件上传到 oracle 数据库时丢弃图像
问题描述
我设计了一个脚本,它将日志文件数据上传到 oracle 数据库。但是我想在我的数据上传中过滤图像。在这种情况下,我不希望我的代码在我的请求中上传具有 .gif 扩展名的 CLIENT_REQUEST("GET /icons/back.gif HTTP/1.1")。有人可以帮我写代码吗?
我的日志文件:-
127.0.0.1,-,-,[06/Aug/2018:09:22:02 +0200],"GET /icons/back.gif HTTP/1.1",304,-,"-"
127.0.0.1,-,-,[06/Aug/2018:09:22:02 +0200],"GET /icons/blank.gif HTTP/1.1",304,-,"-"
127.0.0.1,-,-,[06/Aug/2018:09:22:02 +0200],"GET /icons/unknown.gif HTTP/1.1",304,-,"-"
127.0.0.1,-,-,[06/Aug/2018:09:22:02 +0200],"GET /icons/image2.gif HTTP/1.1",304,-,"-"
127.0.0.1,-,-,[06/Aug/2018:09:22:02 +0200],"GET /icons/text.gif HTTP/1.1",304,-,"-"
我的php代码
<?php
$conn = oci_connect('XYZ', 'XYZxyz1', 'abcdef1/ABC');
if (!$conn) {
$m = oci_error();
echo $m['message'], "\n";
exit;
}
else {
$d = new DateTime();
$yesterday = $d->sub(new DateInterval('P1D'))->format('Y.m.d');
$filename = "access.$yesterday.txt";
$myfile = fopen($filename, "r") or die("Unable to open file!");
while(!feof($myfile)) {
$content= fgets($myfile);
$carray=explode(',',$content);
list($IP_ADDRESS, $USER_IDENTIFIER, $USERID , $REQUEST_TIME , $CLIENT_REQUEST ,$RESPONSE_CODE ,$SIZEOFOBJECT, $COOKIES)=$carray;
$stdii = 'INSERT INTO LOGS(IP_ADDRESS, USER_IDENTIFIER, USERID , REQUEST_TIME , CLIENT_REQUEST ,RESPONSE_CODE ,SIZEOFOBJECT, COOKIES)'.
'values(:IP_ADDRESS, :USER_IDENTIFIER, :USERID , :REQUEST_TIME , :CLIENT_REQUEST ,:RESPONSE_CODE ,:SIZEOFOBJECT, :COOKIES)';
$compiled1 = oci_parse($conn, $stdii);
oci_bind_by_name($compiled1, ':IP_ADDRESS', $IP_ADDRESS);
oci_bind_by_name($compiled1, ':USER_IDENTIFIER', $USER_IDENTIFIER);
oci_bind_by_name($compiled1,':USERID', $USERID);
oci_bind_by_name($compiled1, ':REQUEST_TIME', $REQUEST_TIME);
oci_bind_by_name($compiled1, ':CLIENT_REQUEST', $CLIENT_REQUEST);
oci_bind_by_name($compiled1, ':RESPONSE_CODE', $RESPONSE_CODE);
oci_bind_by_name($compiled1, ':SIZEOFOBJECT', $SIZEOFOBJECT);
oci_bind_by_name($compiled1, ':COOKIES', $COOKIES);
oci_execute($compiled1, OCI_COMMIT_ON_SUCCESS);
}
}
echo "File Uploaded";
oci_close($conn);
fclose($myfile);
?>
解决方案
如果我从您的评论中理解正确,您想将除图像(gif、jpeg 等)之外的所有内容添加到LOGS
表中。有几种方法可以实现这一目标。
进行字符串长度检查。这将从日志中删除检查值,如果它与原始值不匹配,则您有图像。
while() {
if (strlen(str_replace(['.gif', '.jpeg'], '', $log)) !== strlen($log)) {
// Found an image
continue;
}
// Insert
}
或者做一个正则表达式检查,在日志中搜索任何匹配的字符串。
while() {
if (preg_match("/(.*)(gif|jpeg)(.*)/", $log);) {
// Found an image
continue;
}
// Insert
}
或者迭代一个禁止字符串数组并使用 strpos 检查日志是否包含任何禁止字符串。
$bannedStrings = ['.gif', '.jpeg'];
while() {
foreach ($bannedStrings as $string) {
if (strpos($log, $string) !== false) {
// Found a banned string
continue;
}
}
// Insert
}
Stackoverflows 编辑器不断弄乱我试图添加的文档的链接,所以放弃了。
推荐阅读
- java-8 - Java流:将一个对象的列表转换为另一个
- php - 如何使用 PHP 令牌或会话保护 mp4 文件
- python - Pandas、系列 str 访问器和 SettingWithCopyWarning
- r - 地图上的重复值:传单地图
- android - 使用带关系的房间返回错误
- python - 使用 Python 查找 Selenium 元素
- javascript - 关于护照序列化/反序列化用户中的回调函数的困惑
- linux - 由于某些未知原因,在此邮件脚本中获取此 KeyError
- ag-grid - 如何在 ag-grid 中捕获行悬停事件?
- repast-simphony - Repast:批量运行导致 UTF-8 损坏的字符