Я пытаюсь написать базовый код curl на PHP. Я думаю, что я делаю правильно (насколько я читал) -
$url = '0.0.0.0:8080/data.php';
$data = array('username'=>'name','email'=>'[email protected]');
$payload = json_encode(array($data));
print_r($payload);
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_PORT , 8080);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
//curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($ch,CURLOPT_POSTFIELDS,$payload);
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type:application/json'));
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$result = curl_exec($ch);
print_r(curl_getinfo($ch));
curl_close($ch);
Вот как выглядит data.php:
$_POST=json_decode(file_get_contents("php://input"),1);
print_r($_POST);
if (isset($_POST['username'],$_POST['email'])){
$username=mysqli_real_escape_string($db,$_POST['username']);
$email=mysqli_real_escape_string($db,$_POST['email']);
$query = "INSERT INTO tbl_user (username, email)
VALUES('$username', '$email')";
mysqli_query($db, $query);
}
Я не могу понять, почему это не работает. Код зависает на curl_exec(). Я проведу санитарную обработку и буду использовать подготовленные операторы, как только это заработает.
Это журнал:
* Trying 0.0.0.0...
* TCP_NODELAY set
* Connected to 0.0.0.0 (127.0.0.1) port 8080 (#0)
> POST /data.php HTTP/1.1
Host: 0.0.0.0:8080
Accept: */*
Content-Type:application/json
Content-Length: 46
* upload completely sent off: 46 out of 46 bytes
И там застревает. Что я здесь делаю неправильно? Завиток не работает на локальных хостах?
Обновлено: Это серьезное изменение, но я не думаю, что было бы правильным слишком сильно менять первоначальный вопрос. Я сократил все это до -
<?php
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
//curl_setopt ($ch, CURLOPT_PORT , 8080);
curl_setopt($ch, CURLOPT_URL, "http://localhost:8080/data.php");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, true);
//curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
// grab URL and pass it to the browser
curl_exec($ch);
if ( curl_error ( $ch ) ) { echo curl_error ( $ch ); }
// close cURL resource, and free up system resources
curl_close($ch);
?>
Который тоже застревает. Однако то же самое работает и с www.example.com. Поэтому я думаю, что проблема заключается в получении моего URL-адреса.
это журнал:
* Rebuilt URL to: http://localhost:8080/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
Host: localhost:8080
Accept: */*
У data.php сейчас есть только echo "Hello";, чтобы протестировать его.
Могу удалить предыдущие части вопроса, если они не нужны.
Хорошо спасибо. Я сделаю это и обновлю здесь как можно скорее
но проблема все еще остается в том, что код застревает в curl_exec(), как он покажет ошибку, если он не продвинется оттуда?
Вы должны использовать 127.0.0.0.1 или localhost вместо 0.0.0.0 - 4 нуля означают any address, но не какой-то конкретный. Ваш веб-сервер должен быть настроен так, чтобы реагировать на любое значение в заголовке HOST (иначе 4 нуля спутают его). Что вы получаете от print_r($_POST)?
@IVOGELOV Я пытался использовать localhost. Так тоже не работал. Как мне проверить $_POST? Код застрял на curl_exec() и ничего не показывает
Я пытался использовать другие домены, чтобы просто проверить, работает ли curl, и он работает отлично. Я обновлю вопрос, чтобы лучше отразить проблему
Если вы работаете в Windows, вы можете использовать инструмент Hercules (hw-group.com/software/hercules-setup-utility), чтобы прослушивать порт 8080 на localhost и фактически видеть, что отправляет cURL, а также вы можете отправить ответ обратно на cURL и посмотреть, как он реагирует. Вы также можете попробовать свой data.php с помощью инструмента Incomnia (бессонница.отдых)
я на самом деле на линуксе






проверить наличие ошибки с помощью if (curl_error ($ch)) {echo curl_error ($ch)}, после $result = curl_exec ($ch); прежде чем вы сделаете что-нибудь еще!