Я ежедневно создаю файлы журнала Apache. Теперь мне нужно ежедневно вставлять данные этого файла в базу данных Oracle. Я написал код для загрузки файла в базу вручную для одного файла. Однако мне нужен скрипт / код, который автоматически выберет файл из местоположения или просто увеличит имя файла по дате, а затем вставит данные в базу данных (мое имя файла по дате, которая меняется ежедневно. Пример: access.2018.07.24.txt) . Может кто-нибудь помочь.
<?php
$conn = oci_connect('usr1', 'dfdfdf1SS', 'sdsdfdg/XEBH');
if (!$conn) {
$m = oci_error();
echo $m['message'], "\n";
exit;
}
else {
print "Connected to Oracle!";
}
$myfile = fopen("access.2018.07.24.txt", "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);
}
oci_close($conn);
fclose($myfile);
?>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используя класс DateTime в PHP, вы можете сделать это следующим образом. Я предполагаю, что в этом примере вам нужна вчерашняя дата в имени файла
$d = new DateTime();
$yesterday = $d->sub(new DateInterval('P1D'))->format('Y.m.d');
$filename = "access.$yesterday.txt";
echo $filename;
РЕЗУЛЬТАТ (запуск 24/7/2018)
access.2018.07.23.txt
Затем используйте $filename в вызове fopen следующим образом
$myfile = fopen($filename, "r") or die("Unable to open file!");
Спасибо за помощь RiggsFolly. Я пробовал это, но не уверен, как передать это в качестве аргумента при открытии файла. "$ Myfile = fopen ($ filename," r ") or die (" Невозможно открыть файл! ");"
Я добавил это к ответу
Вы удалили echo $filename; из моего примера, не так ли?
да, я его удалил. Ваш код работает нормально. Я допустил ошибку в имени файла (это был доступ. <Дата> .log). Я исправил ошибку и открыл файл. Но теперь в моем массиве есть ошибки. список ($ IP_ADDRESS, $ USER_IDENTIFIER, $ USERID, $ REQUEST_TIME, $ CLIENT_REQUEST, $ RESPONSE_CODE, $ SIZEOFOBJECT, $ COOKIES) = $ carray; Ошибка: Примечание: неопределенное смещение: 7 в C: \ wamp64 \ www \ db_conn \ logs1.php в строке 20
Похоже, ваш журнал доступа к apache выглядит не так, как вы думали. Также обратите внимание, что не все строки в журнале доступа всегда имеют один и тот же формат. Вам нужно будет проверить строку и ее формат, когда вы ее прочитаете, а затем выведите то, что на самом деле находится в этой строке.
Спасибо большое. Сегодня я изменил формат файла журнала и соответственно изменил код. Но в этом коде я получал вчерашний файл, который был в другом формате. Спасибо за помощь, теперь все работает нормально. :)
Хотя я бы начал с ведения журнала всех обработанных журналов, которые вы проверяете в первую очередь, поэтому, если сценарий выйдет из строя в течение нескольких дней и никто не заметит (это произойдет), перезапуск получит все недостающие файлы