Я могу ajax-ом через браузер обратиться к серверу к функции, которая запустит другой скрипт через exec().Да
Не дожидаясь завершения exec() выполнение пойдёт дальше, отдаст ответ клиенту.Нет, если явным образом этого не добиваться
А скрипт запущенный exec() продолжит работать в фоне, даже если клиент закроет браузер.Такое возможно
Есть ли ограничения по времени для скриптов запущенный с помощью exec() или они также отомрут, когда таймаут выйдет?Вродь нет, есть max_execution_time для php скриптов.
<?php
// Получаем токен, он живет 3600 сек, можно кешировать
/*
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 0,
"access_token": "eyJ0eXAiOi..."
*/
$url='https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token';
$params=array
(
'client_id' => 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx', //your-app-id
'client_secret' => 'xxxxxxxxxxxxxxxxx', // your-app-secret
'grant_type'=>'client_credentials', //client_credentials&
'scope'=>'https://api.botframework.com/.default'
);
$result=file_get_contents($url, false, stream_context_create(array('http' => array
(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => http_build_query($params)
))));
$token = json_decode($result, TRUE);
// Соответствия входящему массиву из вызова
// $IN['CHANNEL_NAME']
// $IN['CHANNEL'] = ['conversation']['id']
// $IN['URL'] = ['serviceUrl']
// $IN['TO'] = ['recipient']['id']
// $IN['FROM_ID'] = ['from']['id']
$url =$IN['URL'].'/v3/conversations/'.$IN['CHANNEL'].'/activities/';
$data_string = '
{
"type": "message",
"from": {
"id": "'.$IN['TO'].'",
"name": "Echo Bot"
},
"conversation": {
"id": "'.$IN['CHANNEL'].'"
},
"recipient": {
"id": "'.$IN['CHANNEL'].'",
"name": "User Name"
},
"text": "'.$OUT['MSG'].'",
"replyToId": "'.$IN['FROM_ID'].'"
}
';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Authorization: Bearer '.$token['access_token'].'',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch); // должен вернуть {"id":"0:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
...
left join wp_postmeta as pm
on p.ID = pm.post_id
left join wp_term_relationships as tr
on tr.object_id = p.ID
left join wp_terms as t
on tr.term_taxonomy_id = t.term_id
...
ymaps.ready(init);
function init() {
var center = [56.136, 40.390];
var myMap1 = new ymaps.Map('map1', {
center: center,
zoom: 10
});
var myMap2 = new ymaps.Map('map2', {
center: center,
zoom: 10
});
var myPlacemark1 = new ymaps.Placemark(center, {
// Свойства.
// Содержимое иконки, балуна и хинта.
iconContent: '1',
balloonContent: 'Балун',
hintContent: 'Стандартный значок метки'
}, {
// Опции.
// Стандартная фиолетовая иконка.
preset: 'twirl#violetIcon'
});
var myPlacemark2 = new ymaps.Placemark(center, {
// Свойства.
// Содержимое иконки, балуна и хинта.
iconContent: '2',
balloonContent: 'Балун',
hintContent: 'Стандартный значок метки'
}, {
// Опции.
// Стандартная фиолетовая иконка.
preset: 'twirl#violetIcon'
});
myMap1.geoObjects.add(myPlacemark1);
myMap2.geoObjects.add(myPlacemark2);
}