Попытка отправить запрос POST с одной страницы моего сайта на другую с помощью PHP и Curl

#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-сервер. Исправление этого решило мою проблему!