I'm tring to perform an AJAX request between 2 PHP scripts, one of them just returns (echoes) some data in the form of a json string:
[{'foo':'bar'}]
And the other one just makes a simple http request to it:
$c = new http\Client;
$r = new http\Client\Request('GET', 'http://example.com/script.php');
$c->enqueue($r,
function(http\Client\Response $r) {
// Do something with the Json here.
return true;
})->send();
But I just can't figure out how to get that Json string from the Response object. PECL's documentation doesn't help at all:
<?php
$request = new http\Client\Request("GET",
"http://example.com",
["User-Agent"=>"My Client/0.1"]
);
$request->setOptions(["timeout"=>1]);
$client = new http\Client;
$client->enqueue($request)->send();
// pop the last retrieved response
$response = $client->getResponse();
printf("%s returned '%s' (%d)\n",
$response->getTransferInfo("effective_url"),
$response->getInfo(),
$response->getResponseCode()
);
?>
This just yields:
http://example.com/ returned 'HTTP/1.1 200 OK' (200)
But nothing more. How can I do this?
Update:
This is a dump of the Response object using var_dump.
object(http\Client\Response)[6]
protected 'type' => int 2
protected 'body' =>
object(http\Message\Body)[5]
protected 'requestMethod' => string '' (length=0)
protected 'requestUrl' => string '' (length=0)
protected 'responseStatus' => string 'OK' (length=2)
protected 'responseCode' => int 200
protected 'httpVersion' => string '1.1' (length=3)
protected 'headers' =>
array (size=7)
'Server' => string 'nginx/1.4.7' (length=11)
'Date' => string 'Sat, 20 Dec 2014 23:20:07 GMT' (length=29)
'Content-Type' => string 'text/html' (length=9)
'Connection' => string 'keep-alive' (length=10)
'X-Powered-By' => string 'PHP/5.5.19' (length=10)
'X-Original-Transfer-Encoding' => string 'chunked' (length=7)
'Content-Length' => int 1695
protected 'parentMessage' =>
object(http\Client\Request)[3]
protected 'type' => int 1
protected 'body' =>
object(http\Message\Body)[8]
protected 'requestMethod' => string 'GET' (length=3)
protected 'requestUrl' => string 'http://localhost/battleturnrest/work.GetTop50.php' (length=49)
protected 'responseStatus' => string '' (length=0)
protected 'responseCode' => int 0
protected 'httpVersion' => string '1.1' (length=3)
protected 'headers' =>
array (size=0)
empty
protected 'parentMessage' => null
protected 'options' => null
protected 'transferInfo' =>
object(stdClass)[7]
public 'effective_url' => string 'http://localhost/battleturnrest/work.GetTop50.php' (length=49)
public 'response_code' => int 200
public 'total_time' => float 0.01084
public 'namelookup_time' => float 0.000913
public 'connect_time' => float 0.001345
public 'pretransfer_time' => float 0.002432
public 'size_upload' => float 0
public 'size_download' => float 1695
public 'speed_download' => float 156365
public 'speed_upload' => float 0
public 'header_size' => int 180
public 'request_size' => int 135
public 'ssl_verifyresult' => int 0
public 'filetime' => int -1
public 'content_length_download' => float -1
public 'content_length_upload' => float 0
public 'starttransfer_time' => float 0.010685
public 'content_type' => string 'text/html' (length=9)
public 'redirect_time' => float 0
public 'redirect_count' => int 0
public 'connect_code' => int 0
public 'httpauth_avail' => int 0
public 'proxyauth_avail' => int 0
public 'os_errno' => int 111
public 'num_connects' => int 1
public 'ssl_engines' =>
array (size=0)
empty
public 'cookies' =>
array (size=0)
empty
public 'redirect_url' => string '' (length=0)
public 'primary_ip' => string '127.0.0.1' (length=9)
public 'appconnect_time' => float 0
public 'condition_unmet' => int 0
public 'primary_port' => int 80
public 'local_ip' => string '127.0.0.1' (length=9)
public 'local_port' => int 45915
public 'curlcode' => int 0
public 'error' => string '' (length=0)
This is exactly the same call-request scenario. The main.php calls answer.php, and it answers with json.
answer.php
<?php
// the json header
header('Content-Type: application/json');
// parameter "value" from URL http://.../answer.php?value=bar
$value = $_REQUEST["value"];
// returns exactly [{'foo':'bar'}]
echo(json_encode(array(array("foo" => $value))));
?>
main.php
<?php
...
$bar = "bar";
$url = "http://.../answer.php?value=" . $bar;
$arr = json_decode(file_get_contents($url));
...
>
The most important thing is main.php executes line by line and you can not send two or more calls to the answer.php in the same moment.
But if:
main.php
<?php
// the crucial difference: asynchronous calls to the answer.php
class Ask_For_Value extends Thread {
public function __construct($value, $func){
$this->val = $value;
$this->func = $func;
}
function start(){
$arr = json_decode(file_get_contents("http://.../answer.php?value=" . $this->val));
call_user_func($this->func, $arr);
return(0);// boolean "OK"
}
}
// function to process the result
function do_some_thihg_with_the_result(&$array){...}
// prepare the threads
$call1 = new Ask_For_Value("bar_1", "do_some_thihg_with_the_result");
$call2 = new Ask_For_Value("bar_2", "do_some_thihg_with_the_result");
$call3 = new Ask_For_Value("bar_3", "do_some_thihg_with_the_result");
// start the threads
$call1->start();
$call2->start();
$call3->start();
// there is nothing happens, because the threads
// will continue execution asynchronous and
// independent in the "function do_some_thihg_with_the_result()"
?>
Related
I have the guzzle configured which currently uses getAsync with 4 urls promise. The return of this data comes with 2 arrays, of this format below.
My question, how can I separate into two variables, the first being just the first array? In this example, it would be the entire array of sizes 3154 and in the other variable, the entire array of sizes 10297
Guzzle
$requests = [
getenv('apiSavingNew'),
getenv('apiSavingOld'),
];
$promises = (function () use ($requests) {
$client = new Client([
'verify' => false
]);
foreach ($requests as $request) {
yield $client->getAsync($request);
}
})();
$eachPromise = new EachPromise($promises, [
'concurrency' => 2,
'fulfilled' => function (Response $response) {
if ($response->getStatusCode() == 200) {
$request = json_decode($response->getBody());
$firstRequest = // first array here
$secondRequest = // second array here
}
},
'rejected' => function (RequestException $e) {
echo $e->getMessage();
}
]);
$eachPromise->promise()->wait();
Return guzzle promise
array (size=3154)
0 =>
object(stdClass)[11532]
public 'id' => string '57a64bb0-1c6a-11ec-bfd3-173b9227de8c' (length=36)
public 'createdAt' => string '2021-09-23T12:32:40.427Z' (length=24)
public 'data' => string '2021-09-22T00:00:00.000Z' (length=24)
public 'dataFim' => string '2021-10-22T00:00:00.000Z' (length=24)
public 'valor' => string '0.30120' (length=7)
public 'serieTemporalId' => string 'a43978f1-7fd4-4550-9907-106474e64ee4' (length=36)
public 'acumuladoAno' => null
public 'acumulado12Meses' => null
1 =>
object(stdClass)[11539]
public 'id' => string '57a49e00-1c6a-11ec-bfd3-173b9227de8c' (length=36)
public 'createdAt' => string '2021-09-23T12:32:40.416Z' (length=24)
public 'data' => string '2021-09-21T00:00:00.000Z' (length=24)
public 'dataFim' => string '2021-10-21T00:00:00.000Z' (length=24)
public 'valor' => string '0.30120' (length=7)
public 'serieTemporalId' => string 'a43978f1-7fd4-4550-9907-106474e64ee4' (length=36)
public 'acumuladoAno' => null
public 'acumulado12Meses' => null
more elements...
array (size=10297)
0 =>
object(stdClass)[11545]
public 'id' => string '54f70a30-1c6a-11ec-bfd3-173b9227de8c' (length=36)
public 'createdAt' => string '2021-09-23T12:32:35.923Z' (length=24)
public 'data' => string '2021-09-22T00:00:00.000Z' (length=24)
public 'dataFim' => string '2021-10-22T00:00:00.000Z' (length=24)
public 'valor' => string '0.50000' (length=7)
public 'serieTemporalId' => string 'ec940ca2-7da8-4a75-ae7b-d90244797b65' (length=36)
public 'acumuladoAno' => null
public 'acumulado12Meses' => null
1 =>
object(stdClass)[11557]
public 'id' => string '54f3fcf0-1c6a-11ec-bfd3-173b9227de8c' (length=36)
public 'createdAt' => string '2021-09-23T12:32:35.903Z' (length=24)
public 'data' => string '2021-09-21T00:00:00.000Z' (length=24)
public 'dataFim' => string '2021-10-21T00:00:00.000Z' (length=24)
public 'valor' => string '0.50000' (length=7)
public 'serieTemporalId' => string 'ec940ca2-7da8-4a75-ae7b-d90244797b65' (length=36)
public 'acumuladoAno' => null
public 'acumulado12Meses' => null
more elements...
I didnot understood completely what your requirement is? but still I hope that this might help.
You can add the second argument to function in fulfilled as $index and add it in a separate variable for $results empty array.
$results = [];
$requests = [
getenv('apiSavingNew'),
getenv('apiSavingOld'),
];
$promises = (function () use ($requests) {
$client = new Client([
'verify' => false
]);
foreach ($requests as $request) {
yield $client->getAsync($request);
}
})();
$eachPromise = new EachPromise($promises, [
'concurrency' => 2,
'fulfilled' => function (Response $response, $index) {
if ($response->getStatusCode() == 200) {
//$request = json_decode($response->getBody());
$results[$index] = json_decode($response->getBody(), true);
}
},
'rejected' => function (RequestException $e, $index) {
echo $e->getMessage();
}
]);
$eachPromise->promise()->wait();
I want to get instant cryptocurrency prices on Binance with the help of Websocket. I can do this with javascript as follows. However, this is not useful for me as javascript works on the client side. I want to do this with php to run on the server. I found a few examples in my research, but they were not the solution for me.
Below is a javascript example and I want to learn how to do it in php.
var socket = new WebSocket("wss://stream.binance.com:9443/ws/btcusdt#ticker");
socket.onmessage = function (event) {
var data = JSON.parse(event.data);
console.log(data);
}
I have two classes you can use to connect to the websocket server from php
The sources are at https://github.com/napengam/phpWebSocketServer/tree/master/phpClient
<?php
include __DIR__ . "/../phpClient/websocketCore.php";
class websocketPie extends websocketCore {
public $uuid, $connected = false, $chunkSize = 6 * 1024;
//private $socketMaster;
function __construct($Address, $Port = '', $app = '/', $uu = '') {
if (parent::__construct($Address, $Port, $app, $uu) == false) {
return;
}
$respo = $this->readSocket();
echo var_dump(json_decode($respo));
}
}
$x = new websocketPie("wss://stream.binance.com","9443","/ws/btcusdt#ticker");
The output of above script below:
F:\xampp-htdocs\phpWebSocketServer\websocketExtern\websocketPie_1.php:18:
object(stdClass)[2]
public 'e' => string '24hrTicker' (length=10)
public 'E' => int 1626263895576
public 's' => string 'BTCUSDT' (length=7)
public 'p' => string '-623.48000000' (length=13)
public 'P' => string '-1.885' (length=6)
public 'w' => string '32342.75143871' (length=14)
public 'x' => string '33074.69000000' (length=14)
public 'c' => string '32451.21000000' (length=14)
public 'Q' => string '0.00356600' (length=10)
public 'b' => string '32451.21000000' (length=14)
public 'B' => string '0.00534800' (length=10)
public 'a' => string '32451.22000000' (length=14)
public 'A' => string '0.40745100' (length=10)
public 'o' => string '33074.69000000' (length=14)
public 'h' => string '33078.98000000' (length=14)
public 'l' => string '31550.00000000' (length=14)
public 'v' => string '51376.85373100' (length=14)
public 'q' => string '1661668809.92454695' (length=19)
public 'O' => int 1626177495575
public 'C' => int 1626263895575
public 'F' => int 954365122
public 'L' => int 955537825
public 'n' => int 1172704
I have an Eloquent model that is creating new entries into one of my tables. The problem I am having is each time the page runs it is inserting the data over and over. How can I check if that data already exists in that table and if it doesn't exist, then insert that particular data?
foreach($xml as $product) {
//var_dump($product); die;
Order::where('id', '=', $product->reference)->update(
array(
'invoice_id' => $product['orderid'],
'shipped' => $product['shipped'],
'processed' => $product['processed'],
'problem' => $product['problem'],
)
);
$tracking = new OrderTrack();
$tracking->invoice_id = $product['orderid'];
$tracking->shipper = $product->shipping->shipper;
$tracking->shipping_method = $product->shipping->shipping_method;
$tracking->shipping_date = $product->shipping->shipping_date;
$tracking->shipping_cost = $product->shipping->shipping_cost;
$tracking->tracking_number = $product->shipping->tracking_number;
if(!empty($product->shipping->shipping_notes)) {
$tracking->shipping_notes = $product->shipping->shipping_notes;
}
$tracking->save();
echo'done';
}
The OrderTrack is the section of code I am concerned about. It will create a new entry no matter if the row already exists or not.
$xml var_dump
object(SimpleXMLElement)[294]
public 'order' =>
array (size=15)
0 =>
object(SimpleXMLElement)[295]
public '#attributes' =>
array (size=7)
...
public 'reference' => string '3053' (length=4)
public 'reference2' =>
object(SimpleXMLElement)[310]
...
public 'reference3' =>
object(SimpleXMLElement)[311]
...
public 'invoice' =>
object(SimpleXMLElement)[312]
...
public 'order_date' => string '2014-08-14 03:00:06' (length=19)
public 'billing_date' => string '2014-08-14 00:00:00' (length=19)
public 'changed' => string '2014-08-14 13:02:15' (length=19)
public 'sender' =>
object(SimpleXMLElement)[313]
...
public 'receiver' =>
object(SimpleXMLElement)[314]
...
public 'shipping' =>
object(SimpleXMLElement)[315]
...
public 'products' =>
object(SimpleXMLElement)[316]
...
1 =>
object(SimpleXMLElement)[296]
public '#attributes' =>
array (size=7)
...
public 'reference' => string '3054' (length=4)
public 'reference2' =>
object(SimpleXMLElement)[328]
...
public 'reference3' =>
object(SimpleXMLElement)[329]
...
public 'invoice' =>
object(SimpleXMLElement)[330]
...
public 'order_date' => string '2014-08-13 22:00:02' (length=19)
public 'billing_date' => string '2014-08-14 00:00:00' (length=19)
public 'changed' => string '2014-08-14 13:02:20' (length=19)
public 'sender' =>
object(SimpleXMLElement)[331]
...
public 'receiver' =>
object(SimpleXMLElement)[332]
...
public 'shipping' =>
object(SimpleXMLElement)[333]
...
public 'products' =>
object(SimpleXMLElement)[334]
...
Took advantage of firstOrNew
$tracking = OrderTrack::firstOrNew(array('invoice_id' => $product['orderid']));
$tracking->invoice_id = $product['orderid'];
$tracking->shipper = $product->shipping->shipper;
$tracking->shipping_method = $product->shipping->shipping_method;
$tracking->shipping_date = $product->shipping->shipping_date;
$tracking->shipping_cost = $product->shipping->shipping_cost;
$tracking->tracking_number = $product->shipping->tracking_number;
if(!empty($product->shipping->shipping_notes)) {
$tracking->shipping_notes = $product->shipping->shipping_notes;
}
$tracking->save();
This is a really simple task, that has me absolutely stumped! I'm pulling back some JSON via CURL and PHP, and attempting to access the data from the below structure:
object(stdClass)[1]
public 'maxResults' => int 43
public 'resultList' =>
array (size=43)
0 =>
object(stdClass)[2]
public '#class' => string '' (length=64)
public 'id' => int
public 'version' => int 0
public 'dateCreated' => string '2014-02-11T18:37:55.835+0000' (length=28)
public 'dateModified' => null
public 'locationId' => int
public 'departmentId' => int
public 'ownerCompanyId' => int
public 'active' => boolean true
public 'userId' => int
public 'userName' => string '' (length=24)
public 'externalCode' => null
public 'employeeDetails' =>
object(stdClass)[3]
...
public 'chargeBandAllocationsIds' =>
array (size=7)
...
public 'personalRateChargeBandId' =>
object(stdClass)[13]
...
public 'employeeGroupIds' =>
array (size=0)
...
public 'isResource' => boolean false
(I've removed some of the values, for privacy reasons)
Now I'm trying to var_dump using var_dump(json_decode($result, false));, however when I try and get into the 'resultList' array using var_dump(json_decode($result['resultList'], false)); I get an illegal string offset error.
$result is the JSON string, your cannot do $result['resultList'] on a string. It only becomes a structure after you json_decode it. However, you're decoding it as object, not array, so this wouldn't work either way.
$data = json_decode($result);
var_dump($data->resultList);
var_dump($data->resultList[0]);
var_dump($data->resultList[0]->id);
foreach ($data->resultList as $employee) {
var_dump($employee->id);
}
lets say we do some search useing search api then it retuns something like this in json.
'results' =>
array
0 =>
object(stdClass)[9]
public 'from_user_id_str' => string '57393273' (length=8)
public 'profile_image_url' => string 'http://a1.twimg.com/profile_images/1150792547/49146_1365401218_7951632_q_normal.jpg' (length=83)
public 'created_at' => string 'Mon, 06 Jun 2011 04:01:36 +0000' (length=31)
public 'from_user' => string 'primalokomotif' (length=14)
public 'id_str' => string '77585906684526592' (length=17)
public 'metadata' =>
object(stdClass)[10]
public 'result_type' => string 'recent' (length=6)
public 'to_user_id' => null
public 'text' => string 'RT #detikcom kober siap perkenalkan ajaran klub suami suami takut istri' (length=71)
public 'id' => float 7.7585906684527E+16
public 'from_user_id' => int 57393273
public 'geo' => null
public 'iso_language_code' => string 'id' (length=2)
public 'to_user_id_str' => null
public 'source' => string '<a href="http://mobile.twitter.com" rel="nofollow">Mobile Web</a>' (length=97)
1 =>
object(stdClass)[11]
public 'from_user_id_str' => string '278060132' (length=9)
public 'profile_image_url' => string 'http://a1.twimg.com/profile_images/1355377589/296218442_normal.jpg' (length=66)
public 'created_at' => string 'Mon, 06 Jun 2011 04:01:34 +0000' (length=31)
public 'from_user' => string 'kaka_kecil' (length=10)
public 'id_str' => string '77585897637412864' (length=17)
public 'metadata' =>
object(stdClass)[12]
public 'result_type' => string 'recent' (length=6)
public 'to_user_id' => null
public 'text' => string 'RT #detikcom: 'Milan Tak Pernah Inginkan Hamsik' http://de.tk/dP7Cs via #detiksport' (length=83)
public 'id' => float 7.7585897637413E+16
public 'from_user_id' => int 278060132
public 'geo' => null
public 'iso_language_code' => string 'id' (length=2)
public 'to_user_id_str' => null
public 'source' => string '<a href="http://ubersocial.com" rel="nofollow">ÃœberSocial</a>' (length=94)
2 =>
object(stdClass)[13]
public 'from_user_id_str' => string '185984810' (length=9)
public 'profile_image_url' => string 'http://a0.twimg.com/profile_images/1368466468/a_normal.jpg' (length=58)
public 'created_at' => string 'Mon, 06 Jun 2011 04:01:31 +0000' (length=31)
public 'from_user' => string 'tiayeeeaah' (length=10)
public 'id_str' => string '77585887143276544' (length=17)
public 'metadata' =>
object(stdClass)[14]
public 'result_type' => string 'recent' (length=6)
public 'to_user_id' => null
public 'text' => string 'hmm..hmm.. -___-" RT #detikcom: Bandung Siap Perkenalkan Ajaran Klub Istri Taat Suami http://bit.ly/kCcOsG' (length=111)
public 'id' => float 7.7585887143277E+16
public 'from_user_id' => int 185984810
public 'geo' => null
public 'iso_language_code' => string 'id' (length=2)
public 'to_user_id_str' => null
public 'source' => string '<a href="http://seesmic.com/seesmic_desktop/sd2" rel="nofollow">Seesmic Desktop</a>' (length=115)
3 => etc
how can we return arrays that have date less then one hour ? or filter it? maybe something like do a search then returns all the array that have strtotime(created_at) < strtotime("+1 Hours")
*edit
like How can I use the Twitter Search API to return all tweets that match my search query, posted only within the last five seconds?
but there is no answer doing this.
thanks for looking in
Adam Ramadhan
So, you're looking to return only those that have created_at within the past hour? I like to use array_filter() when I can.
function filterWithinHour($obj)
{
return (strtotime($obj->created_at) > strtotime('-1 hour'));
}
$recent = array_filter($results, 'filterWithinHour');
If you ever need need to pass it a certain time (instead of assuming now), you might want to just loop through the array manually rather than mess with trying to pass a time parameter to the callback with a global variable. I hate globals used like that.
The Twitter Search API has a since_id that could help you:
Returns results with an ID greater
than (that is, more recent than) the
specified ID. There are limits to the
number of Tweets which can be accessed
through the API. If the limit of
Tweets has occured since the since_id,
the since_id will be forced to the
oldest ID available.
If you poll every hour, you effectively get the posts of the last hour. If the service is down, you still won't miss any tweets since you could go back several days.