#php #post #curl
#php #Публикация #curl
Вопрос:
Привет всем, я видел несколько вопросов по этой теме здесь, но ни один из них не решил мою проблему. На моем сайте есть скрипт, который я хочу использовать для генерации нескольких различных типов электронных писем моим пользователям. Я хотел иметь возможность создавать файлы шаблонов для разных электронных писем, которые принимают переменные $ _POST для заполнения соответствующей информации, и просто отправлять post-запрос к этим шаблонам и получать ответ на place в качестве тела электронного письма. Я пытаюсь написать функцию, которая принимала бы местоположение файла шаблона (подойдет относительный или абсолютный, но я бы предпочел относительный честно), и массив параметров, которые я хотел бы отправить в шаблон через post. Пока мне не повезло. Вот мой код на данный момент:
private function post_request($url, $data) {
$output = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
curl_close($ch);
if ($result) {
$output['status'] = "ok";
$output['content'] = $result;
} else {
$output['status'] = "failure";
$output['error'] = curl_error($ch);
}
curl_close($ch);
return $output;
}
Я получал сообщение об ошибке «не удалось подключиться к хосту» от curl, но после вывода моего URL-адреса в журнал ошибок я смог убедиться, что копирование и вставка URL-адреса в firefox приводит к правильному отображению страницы.
Есть идеи? Я не женат на идее использования curl, поэтому, если есть лучший вариант, я был бы более чем счастлив использовать его вместо этого. Всем спасибо за помощь!
Ответ №1:
Вы должны иметь возможность использовать file_get_contents() для этого, если ваш хост не запретил ему доступ к удаленным местоположениям (и скрипт $ url не ищет исключительно данные POST).
private function post_request($url, $data) {
$output = array();
$url_with_data = '';
foreach ( $data as $k=>$v ){ // Loop through data and create request string
$url_with_data .= 'amp;' . $k . '=' . $v;
}
// Remove first ampersand and encode the data
$url_with_data = urlencode( substr( $url_with_data, 1 ) );
// Request file
// Format will be http://url.com?var1=dataamp;var2=dataamp;var3=data
$result = file_get_contents( $url . '?' . $url_with_data );
if ($result) {
$output['status'] = "ok";
$output['content'] = $result;
} else {
$output['status'] = "failure";
$output['error'] = 'Could not open remote file';
}
return $output;
}
Ответ №2:
Другой вариант: вы говорите, что оба файла находятся на одном сервере. Если это так, вы можете просто запросить () конструктор шаблонов.
private function post_request($url, $data) {
$output = array();
@require_once('./path/to/template_builder.php');
if ($result) {
$output['status'] = "ok";
$output['content'] = $result;
} else {
$output['status'] = "failure";
$output['error'] = 'Could not open remote file';
}
return $output;
}
Затем в template_builder.php:
<?php
unset( $result );
if ( is_array( $data ) ){
// Parse $data ...
$result = $email_template;
}
Ответ №3:
Как оказалось, проблема оказалась ошибкой конфигурации сервера. При попытке связаться с файлом у сервера истекло время ожидания, потому что он попал на неправильный DNS-сервер. Исправление этого решило мою проблему!