Fastest way to reach a url via PHP - php

What is the fastest way to reach a URL with PHP without any output needed?
I did a testing on the code below by using file_get_contents and CURL, but the result inconstant and very close to each other.
function abtest()
{
$arr_to_return = array();
$t = microtime(true);
file_get_contents('http://127.0.0.1/test.html');
$e = microtime(true);
$arr_to_return['file_get_contents'] = $e-$t;
$t = microtime(true);
$handle = curl_init('http://127.0.0.1/test.html');
curl_setopt($handle, CURLOPT_NOBODY, TRUE);
curl_exec($handle);
curl_close($handle);
$e = microtime(true);
$arr_to_return['curl'] = $e-$t;
return $arr_to_return;
}
$limit = 20;
$count = 0;
$result = array();
$filegetcontents = 0;
$curl = 0;
do{
$test = abtest();
$result['file_get_contents'][] = $test['file_get_contents'];
$filegetcontents += $test['file_get_contents'];
$result['curl'][] = $test['curl'];
$curl += $test['curl'];
$count++;
} while ( $count < $limit);
echo '<pre>';
print_r($result);
echo '</pre>';
echo 'Average: file_get_contents ('.($filegetcontents/$limit).') curl ('.($curl/$limit).')';
As per suggested, I put it into a function and loop 20 times on localhost with direct IP.
Result as below:
Array
(
[file_get_contents] => Array
(
[0] => 0.0055451393127441
[1] => 0.0056819915771484
[2] => 0.0056838989257812
[3] => 0.014945983886719
[4] => 0.014636993408203
[5] => 0.014842987060547
[6] => 0.0053179264068604
[7] => 0.015022039413452
[8] => 0.014861106872559
[9] => 0.015033960342407
[10] => 0.015429973602295
[11] => 0.015249013900757
[12] => 0.01471996307373
[13] => 0.015311002731323
[14] => 0.0054020881652832
[15] => 0.015032052993774
[16] => 0.0051870346069336
[17] => 0.014680147171021
[18] => 0.014776945114136
[19] => 0.015046119689941
)
[curl] => Array
(
[0] => 0.0013649463653564
[1] => 0.0017318725585938
[2] => 0.0013041496276855
[3] => 0.0013928413391113
[4] => 0.0013279914855957
[5] => 0.0013871192932129
[6] => 0.011061906814575
[7] => 0.0013771057128906
[8] => 0.010823011398315
[9] => 0.0015439987182617
[10] => 0.0015928745269775
[11] => 0.0014979839324951
[12] => 0.0016429424285889
[13] => 0.011864900588989
[14] => 0.0015189647674561
[15] => 0.0014710426330566
[16] => 0.0014939308166504
[17] => 0.001460075378418
[18] => 0.011038064956665
[19] => 0.010931015014648
)
)
Average: file_get_contents (0.012120318412781) curl (0.0038913369178772)
Seems result of CURL is better than file_get_contents most of the time. Any faster way to do this other than above?

Related

I want all arrays data in one array in php

I want all arrays data in one array not all arrays in one array only the data of all arrays in one array without any other array in php. I have tried to do too many things but still don't work for me.
I also tried
json_encode
with
preg_match
But still don't work for me.
Here is my code
function fetchHashtags($getData){
$body = $getData;
$hashtag_set = [];
$array = explode('#', $body);
foreach ($array as $key => $row) {
$hashtag = [];
if (!empty($row)) {
$hashtag = explode(' ', $row);
$hashtag_set[] = '#' . $hashtag[0];
}
}
print_r($hashtag_set);
}
Output
Array
(
[0] => #Residência
[1] => #architecture
[2] => #casanaserra
[3] => #mountainhouse
[4] => #interiores
[5] => #decoration
[6] => #casanaserra
[7] => #casadecampo
[8] => #construção
[9] => #exterior
[10] => #rustico
[11] => #arpuro
[12] => #home
[13] => #riodejaneiro
[14] => #construir
[15] => #casasincriveis
[16] => #outdoor
[17] => #arquiteto
[18] => #casasincriveis
[19] => #montanhas
[20] => #archdaily
[21] => #architecturelovers
[22] => #arqlovers
[23] => #arqlove
[24] => #homedesign
[25] => #arquiteturaedecoração
)
Array
(
[0] => #We
[1] => #ascaspenvswheaton
)
Array
(
[0] => #شجریان_بشنویم...
[1] => #۰
[2] => #شجریان_بشنویم
[3] => #_
[4] => #شجریانیها
[5] => #همایون_شجریان
[6] => #مژگان_شجریان
[7] => #پرویزمشکاتیان
[8] => #موزیک
[9] => #سهراب_پورناظری
[10] => #محمدرضا_شجریان
[11] => #موزیک_ویدیو
[12] => #ایران
[13] => #ترانه_ماندگار
[14] => #تصنیف
[15] => #آهنگ_ایرانی
[16] => #هنر
[17] => #موسیقی_ایرانی
[18] => #شعروشاعری
[19] => #موسیقی_سنتی_ایران
[20] => #آواز_سنتی
[21] => #قدیمیها
[22] => #دلشدگان
[23] => #دلنشین
[24] => #سینما
[25] => #homayoun_shajarian
[26] => #music
[27] => #mohamadrezashajarian
[28] => #home
[29] => #iran
[30] => #shajarian
)
And one more thing i also want to remove some data that don't look like hashtags.
for example:
Array
(
[0] => #Residência
[1] => architecture // This should be removed
[2] => #casanaserra
[3] => mountainhouse // This also should be removed
[4] => #interiores
)
As you can see from my code you can use array_merge for merge arrays then use array_filter for filter value without # or other rules you need:
$array = [['1', '#2', '3', '#4'], ['5', '#6']];
$flatArray = array_merge(...$array);
$filteredArray = array_filter($flatArray, function($a) {
if (str_contains($a, '#')) {
return $a;
}
});
print_r($filteredArray);
Result:
Array (
[1] => #2
[3] => #4
[5] => #6 )
Reference:
array_merge
array_filter
str_contains
After seeing your code and the context of the situation I changed things:
Instead of use explode i used preg_split for split \n and space;
Delete array_map because you don't need it.
$array = ["
My name is Faraz shaikh i am a php developer and this my #instagram profile.Check out my #merge and my #packages with new #hashtags
#chinese #art #colors #home #harmory #peace #handmade #paintings #etsy
", "
My name is Hunain shaikh i am a php developer and this my #Facebook profile.Check out my #Berge and my #Hackages with new #tags
#english #Kite #colours #me #memory #pee #made #paints #etsafsy
"];
function fetchHashtags($getData) { // This Functions takes out the hashtags from the string and put it in to arrays.
$body = $getData;
$hashtag_set = [];
$array = preg_split('/[\s]+/', $body);
$mapArray = array_map(function($a) {
return str_replace(' ', '', $a);
}, $array);
$filteredArray = array_filter($mapArray, function($a) {
if (str_contains($a, '#')) {
return $a;
}
});
return $filteredArray;
}
$recentNumberOfPosts = 1;
$zeroPost = 0; //Get Post from 0 to recentNumberOfPosts | NOTE: default = 4
$finalArr = [];
while ($zeroPost <= $recentNumberOfPosts) {
// fetchHashtags($hashtagRecent['data'][$zeroPost]['caption']);
$finalArr[] = fetchHashtags($array[$zeroPost]);
$zeroPost++;
}
print_r(array_merge(...$finalArr));
Fiddle

timezone_name_from_abbr is not working in php

I am working in PHP. I want to get my timezone, Asia/Dhaka, from offset 6x60x60 = 21600. I have tried with timezone_name_from_abbr("", 21600, false);
But it's not working. I'm getting false.
What can I do now?
The official documentation mentions a bug in that function : PHP timezone_name_from_abbr
You can write a function to parse the result of timezone_abbreviations_list() yourself :
/* Takes a GMT offset and returns a timezone name */
function tz_offset_to_name($offset, $dst)
{
$results = array();
$abbrarray = timezone_abbreviations_list();
foreach ($abbrarray as $abbr)
{
foreach ($abbr as $city)
{
if ($city['offset'] == $offset and $city['dst'] == $dst)
{
$results[] = $city['timezone_id'];
}
}
}
return $results;
}
It gives the correct result :
$offset = 6*60*60 ;
$tz = timezone_name_from_abbr("", $offset, false);
var_dump($tz); // false
$tz = tz_offset_to_name($offset, false);
print_r($tz);
(
[0] => Asia/Aqtobe
[1] => Asia/Almaty
[2] => Asia/Dacca
[3] => Asia/Dhaka
[4] => Asia/Thimbu
[5] => Asia/Thimphu
[6] => Asia/Dacca
[7] => Asia/Dhaka
[8] => Asia/Dushanbe
[9] => Asia/Bishkek
[10] => Asia/Hovd
[11] => Indian/Chagos
[12] => Asia/Bishkek
[13] => Asia/Qyzylorda
[14] => Asia/Krasnoyarsk
[15] => Asia/Novokuznetsk
[16] => Asia/Colombo
[17] => Antarctica/Mawson
[18] => Asia/Novosibirsk
[19] => Asia/Novokuznetsk
[20] => Asia/Omsk
[21] => Asia/Qyzylorda
[22] => Asia/Aqtau
[23] => Asia/Samarkand
[24] => Asia/Tashkent
[25] => Asia/Oral
[26] => Antarctica/Vostok
[27] => Asia/Kashgar
[28] => Asia/Urumqi
[29] => Asia/Yekaterinburg
[30] =>
)

Remove elements with dot in their path doesnt work

I need to remove all elements that contains dot in array that i receive fron ftp_nlist(), this is how i do that:
$connection = ftp_connect($host);
if(!$connection){
echo "Can't connect to $host ($login:$password)\n";
#print_r(error_get_last());
ftp_close($connection);
exit();
}
ftp_login($connection, $login, $password);
ftp_pasv($connection, TRUE);
$files_list = ftp_nlist($connection, $path);
print_r($files_list);
for($i = 0; $i< count($files_list); $i++){
if( strstr($files_list[$i], '.') ){
unset($files_list[$i]);
}
}
print_r($files_list);
echo 'Ok';
However it works strange
Array
(
[0] => /httpdocs/favicon.ico
[1] => /httpdocs/mobile.html
[2] => /httpdocs/g
[3] => /httpdocs/index.html
[4] => /httpdocs/.
[5] => /httpdocs/member.html
[6] => /httpdocs/sitemap.xml
[7] => /httpdocs/animated_favicon1.gif
[8] => /httpdocs/rakuten.html
[9] => /httpdocs/y_key_8866d9fb86f18b30.html
[10] => /httpdocs/robots.txt
[11] => /httpdocs/..
[12] => /httpdocs/bbs.html
[13] => /httpdocs/version.php
[14] => /httpdocs/css
[15] => /httpdocs/nas
[16] => /httpdocs/googlee7e5921970ceb672.html
[17] => /httpdocs/about.html
[18] => /httpdocs/images
)
Array
(
[2] => /httpdocs/g
[10] => /httpdocs/robots.txt
[11] => /httpdocs/..
[12] => /httpdocs/bbs.html
[13] => /httpdocs/version.php
[14] => /httpdocs/css
[15] => /httpdocs/nas
[16] => /httpdocs/googlee7e5921970ceb672.html
[17] => /httpdocs/about.html
[18] => /httpdocs/images
)
Ok
As you can see not all elements with dots was removed. I can't see clear reason why.
Every time you unset() an array element the count() in the condition is decreased by 1. So instead of using count($files_list); in the condition (this is evaluated each iteration), set it first so it doesn't change:
$count = count($files_list);
for($i = 0; $i < $count; $i++){
if(strpos($files_list[$i], '.') !== false){
unset($files_list[$i]);
}
}
I would prefer foreach():
foreach($files_list as $key => $file){
if(strpos($file, '.') !== false){
unset($files_list[$key]);
}
}
Also notice that strpos() is better suited here.

Finding MAX value of raw CSV data for specific column in PHP

Using cURL:
$url = $some_site;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
where the '$output' variable contains the following 7 columns (# of rows will vary):
1,a,6045,6168,6731,6847,522800
2,b,7847,8124,7645,7716,614400
3,c,7288,7633,7150,7442,801800
4,d,5546,5791,5460,5581,554200
5,e,4579,4679,4359,4572,557400
etc ...
As you can see, in the 4th column, the numbers are:
6168
8124
7633
5791
4679
And the highest number is: 8124
I am trying to figure out how to parse the '$output' variable so I can evaluate all the numbers in the 4th column to determine the high.
I have tried:
$csv = array_map('str_getcsv', $output);
echo max($csv[4]);
But nothing is returned
If you output your $csv value you will see that it is array with structure like:
...
[2] => Array
(
[0] => 3
[1] => c
[2] => 7288
[3] => 7633
[4] => 7150
[5] => 7442
[6] => 801800
)
[3] => Array
(
[0] => 4
[1] => d
[2] => 5546
[3] => 5791
[4] => 5460
[5] => 5581
[6] => 554200
)
[4] => Array
(
[0] => 5
[1] => e
[2] => 4579
[3] => 4679
[4] => 4359
[5] => 4572
[6] => 557400
)
....
So your $csv[4] is not a list of values from column 4. It's the 5th element of your array. So you need to go further, either with a simple foreach:
$max = 0;
foreach ($csv as $row) {
// use index `3` because numeration starts with `0`
if ($max < $row[3]) {
$max = $row[3];
}
}
Or with array_column (since php5.5):
// take all values witn index `3` and find max
echo max(array_column($csv, 3));
In both cases it is 8124
It's because str_getcsv not following standards, and from output You have a "broken array"... I suppose that it may look like this:
Array
(
[0] => 1
[1] => a
[2] => 6045
[3] => 6168
[4] => 6731
[5] => 6847
[6] => 522800
2
[7] => b
[8] => 7847
[9] => 8124
[10] => 7645
[11] => 7716
[12] => 614400
3
[13] => c
[14] => 7288
[15] => 7633
[16] => 7150
[17] => 7442
[18] => 801800
4
[19] => d
[20] => 5546
[21] => 5791
[22] => 5460
[23] => 5581
[24] => 554200
5
[25] => e
[26] => 4579
[27] => 4679
[28] => 4359
[29] => 4572
[30] => 557400
)
http://sandbox.onlinephpfunctions.com/code/b5834d98eda11b1726adc9ef1b7592f9ba32242c
You can do it like this:
<?php
// $csv is just a string ... output from Your curl will be same I think
$csv = <<<EOT
1,a,6045,6168,6731,6847,522800
2,b,7847,8124,7645,7716,614400
3,c,7288,7633,7150,7442,801800
4,d,5546,5791,5460,5581,554200
5,e,4579,4679,4359,4572,557400
EOT;
function csv2array($csv) {
$csv = str_getcsv($csv, PHP_EOL);
return array_map('str_getcsv', $csv);
}
function findMaxInColumn($array, $column = 3) {
return max(array_column($array, $column));
}
$parsedCsv = csv2array($csv);
print_r(findMaxInColumn($parsedCsv));
http://sandbox.onlinephpfunctions.com/code/82020f0d85acf8d6b15b5e7fd78a8d1a80618ff2

PHP Array Contain string

i create a method that will read a file with the application/octet type and here are some of the code.
Raw data :
GTHHS;MEKID Interface;5496;2012-07-20;
NM1;081;IN1;980898989;2001-01-15;Mr;Gaf;Uhkil;Uhkil,Gaf;PRI;Gaf
$contents = file_get_contents($tmp_filename);
$stringContents = explode(";", $contents);
Now it gives me this output :
Array
(
[0] => GTHHS
[1] => MEKID Interface
[2] => 5496
[3] => 2012-07-20
NM1
[4] => 081
[5] => IN1
[6] => 980898989
[7] => 2001-01-15
[8] => Mr
[9] => Gaf
[10] => Uhkil
[11] => Uhkil,Gaf
[12] => PRI
[13] => Gaf
PR1
[14] => 081
[15] => IN1
[16] => 20730089
[17] => 7 The Schooner
[18] => Auhaas
[19] => Huuula Ave
[20] =>
[21] => Kishma
PR2
[22] => 081
[23] => IN1
[24] => 232323233
[25] => 400006
[26] => HGD
[27] => M
[28] => M
[29] => 2007-10-16
[30] => 1976-03-31
);
How can i make the NM1, PR1 as the head of array like this :
Array (
[NM1] = array(
[0] => GTHHS
[1] => MEKID Interface
[2] => 5496
[3] => 2012-07-20
)
);
I am planning also to make the inner array [0]-[3] as json.
If you explode the contents by \n you have each line starting with that identifier. If you then just explode by ; in that line and add it as a sub array, you got it like you want.
This actually looks like a plain old CSV file with your ifentifier in line one. If so, try something like this:
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE)
{
while (($row = fgetcsv($handle, 1000, ";", "\"", "\n")) !== FALSE)
{
$key = array_shift($row);
$data[$key] = $row;
}
fclose($handle);
}
echo json_encode($data);
http://php.net/manual/en/function.str-getcsv.php

Categories