PHP Backend Application(5)Redis Advanced and PHP Memory and HTTP Client

PHP Backend Application(5)Redis Advanced and PHP Memory and HTTP Client

1 Trouble Shooting PHP Memory and TimeZone Issue
Error Message:
1) SegmentServiceTest::testGetCampaignConfig
date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.

Solution:
http://stackoverflow.com/questions/16765158/date-it-is-not-safe-to-rely-on-the-systems-timezone-settings

I met this issue when I install Symfony long time ago
http://sillycat.iteye.com/blog/2149513

> cat /etc/php.ini
; http://php.net/date.timezone
date.timezone = America/North_Dakota/Center
display_errors = On
memory_limit = 512M

Since I manually install the php myself, so my php.ini file actually is in this place.
> ls -l /etc/ | grep php
lrwxrwxrwx 1 root root 20 Jun 17 02:43 php.ini -> /opt/php/lib/php.ini

Memory Issues
> phpunit --bootstrap vendor/autoload.php tests/JobConsumerPHP/SegmentServiceTest
PHPUnit 5.4.6 by Sebastian Bergmann and contributors.

..
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 3248 bytes) in /home/ec2-user/users/carl/jobs-consumerphp/src/JobConsumerPHP/SegmentService.php on line 166

Solution:
give more memory limit in php.ini as follow:
memory_limit = 512M

2 HTTP Client
I plan to use this client library.
http://docs.guzzlephp.org/en/latest/request-options.html#json
https://github.com/guzzle/guzzle

Set up the configuration in composer.json
"guzzlehttp/guzzle": "^6.2"


Try to initiate the client in base class and reuse them.
<?php

namespace JobConsumerPHP;

require __DIR__.'/../../vendor/autoload.php';

use \GuzzleHttp\Client;
use \GuzzleHttp\Psr7\Request;

class WebHttpClient
{

protected $classifierClient = null;

protected $predictionClient = null;

protected $ioc = null;

public function __construct($ioc)
{
$this->ioc = $ioc;

$logger = $this->ioc->getService("logger");
$config = $this->ioc->getService("config");

$logger->info("==============WebClient config start ==============");
$classifierURL = $config['classifierURL'];
$classifierKey = $config['classifierKey'];

$predictionURL = $config['predictionURL'];
$predictionKey = $config['predictionKey'];

$gatewayKey = $config['gatewayKey'];
$httpTimeout = $config['httpTimeout'];

$logger->info("classifierURL = {$classifierURL}");
$logger->info("classifierKey = {$classifierKey}");
$logger->info("predictionURL = {$predictionURL}");
$logger->info("predictionKey = {$predictionKey}");
$logger->info("predictionKey = {$predictionKey}");
$logger->info("httpTimeout = {$httpTimeout}");
$logger->info("=============================================");

try
{
$this->classifierClient = new Client([
'base_uri' => $classifierURL,
'timeout' => $httpTimeout,
'connect_timeout'=> $httpTimeout,
]);
$this->predictionClient = new Client([
'base_uri' => $predictionURL,
'timeout' => $httpTimeout,
'connect_timeout' => $httpTimeout,
'headers' => [
'Content-Type' => 'application/json',
'x-api-key' => $predictionKey,
'api-gateway-key' => $gatewayKey,
],
]);
} catch (Exception $e) {
$logger->error("Couldn't init the HTTP Client.");
$logger->error($e->getMessage());
}
}

/**
* post params to classifier
* @param string $path
* @param array $params, format will be ['key1'=>'value1', 'key2'=>'value2',]
* @return response
*/
public function post2Classifier($path, $params)
{
$logger = $this->ioc->getService("logger");

try{
$response = $this->classifierClient->request('POST', $path, [
'form_params' => $params
]
);
return $response;
}catch(RequestException $e){
$logger->error(\GuzzleHttp\Psr7\str($e->getRequest()));
if ($e->hasResponse()) {
$logger->error(\GuzzleHttp\Psr7\str($e->getResponse()));
}
}
}

/**
* post json params to prediction
* @param string $path
* @param array $params, format will be ['key1' => 'value1', 'key2' => 'value2',]
* @return response
*/
public function post2Prediction($path, $params)
{
$logger = $this->ioc->getService("logger");

try{
$response = $this->predictionClient->request('POST', $path, [
'json' => $params
]);
return $response;
}catch(RequestException $e){
$logger->error(\GuzzleHttp\Psr7\str($e->getRequest()));
if ($e->hasResponse()) {
$logger->error(\GuzzleHttp\Psr7\str($e->getResponse()));
}
}
}

}

?>

Test class to cover all the functions in WebHttpClientTest.php.
<?php

use \JobConsumerPHP\IOCUtil;
use function GuzzleHttp\json_decode;

class WebHttpClientTest extends PHPUnit_Framework_TestCase{


protected $webHttpClient;


protected function setUp()
{
$ioc = new IOCUtil();

$this->webHttpClient = $ioc->getService("webHttpClient");

}


public function testDummy()
{
$this->assertTrue(true);

}


public function testPost2Classifier()
{
$path = '/get/job/industry/predictions';

$params = [

'title'=>'senior engineer',


'description'=>'java, scala, python, php, nodejs',


];

$response = $this->webHttpClient->post2Classifier($path, $params);

$this->assertNotEmpty($response);

$this->assertEquals(200, $response->getStatusCode());

$this->assertNotEmpty($response->getBody());

$result = json_decode($response->getBody(), true);

$this->assertNotEmpty($result);

$this->assertTrue(count($result) > 0 );

$this->assertNotEmpty($result[0]);

$this->assertNotEmpty($result[0]['majorCategory']);

}


public function testPost2Prediction()
{
$path = '/v0.9/campaigns/3275/jobPrediction?accountID=0';

$params = [

'applicationName' => 'Sample Application',


'title' => 'Senior Engineer',


'description' => 'Java, Scala, Python, Perl, NodeJS, Groovy, PHP',


'jobCompanyName' => 'Sample Company',


'locations' => [ array("postalCode" => "78729", "postalCode" => "78749") ],


];

$response = $this->webHttpClient->post2Prediction($path, $params);

$this->assertNotEmpty($response);

$this->assertEquals(200, $response->getStatusCode());

$this->assertNotEmpty($response->getBody());


$result = json_decode($response->getBody(), true);

$this->assertNotEmpty($result);

$this->assertTrue(count($result) > 0);

$this->assertNotEmpty($result['jobPredictions']);

$this->assertNotEmpty($result['jobPredictions'][0]);

$this->assertNotEmpty($result['jobPredictions'][0]['suggestedBudget']);

}


}

?>

References:
Redis Command Doc
http://redis.io/commands#sorted_set
Redis PHP Doc
https://github.com/phpredis/phpredis#zrange

https://www.neontsunami.com/posts/how-to-solve-phpunit-exiting-without-errors
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值