У меня есть IP-телефон, который через 2 URL-адреса действия делает запрос на получение моего веб-сервера.
URL действия:
http://192.168.25.126/action.php?ID=$call_id&remote=$display_remote
http://192.168.25.126/action.php?ID=$call_id&extension=$active_user
192.168.25.126
это веб-сервер
action.php
печатает в лог файл запрос
$call_id
это уникальный идентификатор, который телефон дает текущему сеансу
$remote
номер звонящего
$extension
это добавочный номер IP-телефона
на стороне сервера у меня есть action.php
который печатает в лог-файл запросы через эту простую строку
<?php
file_put_contents("/tmp/post.log",print_r($_GET,true), FILE_APPEND));
?>
проверяя журнал я могу просмотреть ожидаемый запрос
tail -f /tmp/post.log
Array
(
[ID] => 9
[remote] => +39123456789
)
Array
(
[ID] => 9
[extension] => 235
)
Как я могу объединить в tmp.log массивы с таким же идентификатором, как это?
Array
(
[ID] => 9
[remote] => +39123456789
[extension] => 235
)
обратите внимание, что первый arrey генерируется при событии звонка, а второй arrey генерируется, когда я снимаю трубку (или, лучше сказать, при поступлении вызова), поэтому во второй момент
Я не могу сделать это только с одним действием URL, как это
http://192.168.25.126/action.php?ID=$call_id&remote=$display_remote&extension=$active_user
Из-за ограничения моего IP-телефона, поэтому я должен объединить 2 массива. и, если возможно, я хотел бы, но это не является действительно необходимым, чтобы журнал печатался только в том случае, если существует первый массив с таким же идентификатором (поэтому журнал будет отображаться только при ответе на входящий вызов, а не при выполнении вызова).
Я старший ИТ-специалист, а не php-кодер, поэтому просто хочу предложить написать цикл .. большое спасибо
Из того, что я понимаю, это должно делать то, что вам нужно — ожидать, что идентификаторы будут уникальными.
<?php
// get data from log
$fileData = file_get_contents("/tmp/post.log");
$data = json_decode($fileData, true); // make an array out of the json
// $data will now be something like this:
# $data = [["ID" => 9,"remote" => "+39123456789"],["ID" => 10,"remote" => "+41123456789"]];
// mocking input data
# $_GET = ['ID' => 10, 'otherparam' => 'bar'];
$key = array_search($_GET['ID'], array_column($data, 'ID')); // search for pre-saved data
if($key) { // an item with $ID was found -> merge new data
$item = array_merge($data[$key], $_GET);
$data[$key] = $item; // overwrite existing item with this ID
} else {
$item = $_GET; // create a new item, since we haven't found one
$data[] = $item; // append to data
}
file_put_contents("/tmp/post.log",json_encode($data,true))); // don't append, write the whole dataset
Если идентификаторы не уникальны, мы могли бы просто взять последний добавленный (с помощью end (), проверить, совпадают ли идентификаторы и объединиться там:
end($data); // set pointer to the end
$key = key($data); // get the key of the last element
if($data[$key]['ID']==$_GET['ID']) {
$item = array_merge($data[$key], $_GET); // merge old and new data
$data[$key] = $item; // overwrite item
}
РЕДАКТИРОВАТЬ:
Если вам нужен только последний вызов, нам не нужно повторно сохранять несовпадающие массивы, поэтому этот адаптированный код должен сделать:
<?php
$fileData = file_get_contents("/tmp/post.log");
$data = json_decode($fileData, true);
// $data will now be something like this:
# $data = ["ID" => 9,"remote" => "+39123456789"]; // note, this time it's a one-dimentional (but assoc) array.
// mocking input data
# $_GET = ['ID' => 9, 'otherparam' => 'bar'];
// check if we have pre-saved data, that has an 'ID' and that matches our current one:
if(is_array($data) && isset($data['ID']) && $data['ID']==$_GET['ID']) { // the saved $ID was found -> merge new data
$data = array_merge($data, $_GET);
} else {
$data = $_GET; // create a new item, since we haven't found one
}
file_put_contents("/tmp/post.log",json_encode($data,true))); // don't append, write the whole dataset
Отказ от ответственности: Этот код не проверяет ошибки вообще и выдает ошибки в пустой журнал (потому что json_decode потерпит неудачу, если данных пока нет), имеет некоторые проблемы с безопасностью (использование $ПОЛУЧИТЬ без очистки и записи этого в файл …), не проверяет правильность ввода (что делать, если идентификатор не отправляется) и т. Д …
Других решений пока нет …