The instructions for installing a query builder for dynamodb in Laravel which include the step
"Update DynamoDb config in config/dynamodb.php"
Obviously then I put in the required credentials.
I then create a test model and that's fine but periodically,
Keeps on stripping the values back to:
'dynamodb' =>
array (
'default' => 'aws',
'connections' =>
array (
'aws' =>
array (
'credentials' =>
array (
'key' => NULL,
'secret' => NULL,
'token' => NULL,
),
'region' => NULL,
'debug' => NULL,
),
I tried also putting the values in my .env file as such:
DYNAMODB_KEY=
DYNAMODB_SECRET=
DYNAMODB_REGION=
But these are not read.
Is there a step somewhere I have missed?
Related
I'm using Illuminate\Queue outside of a Laravel app inside an add-on for a CMS. So the only instances of Laravel or Illuminate are these packages that I've required:
"illuminate/queue": "^8.83",
"illuminate/bus": "^8.83",
"illuminate/contracts": "^8.83"
I'm first trying to use the Database for the queue as the default driver since the CMS is database driven, then provide options to SQS etc. I've setup everything so the migrations create my queue tables and everything seems to be wired together when I make the following call to push something to the queue.
/** #var \Illuminate\Queue\QueueManager $queue */
$queue->push('test', ['foo' => 'bar']);
Then it ends in the following error. The parameter bindings are not working or something. It's leaving the ? in the values list.
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"exp_dgq_jobs" ("queue", "attempts", "reserved_at", "available_at", "created_at"' at line 1 (SQL: insert into "exp_dgq_jobs" ("queue", "attempts", "reserved_at", "available_at", "created_at", "payload") values (default, 0, ?, 1674567590, 1674567590, {"uuid":"6bf7a17e-dda3-4fed-903a-8714e5a2d146","displayName":"test","job":"test","maxTries":null,"maxExceptions":null,"failOnTimeout":false,"backoff":null,"timeout":null,"data":{"foo":"bar"}}))
I've step debugged the whole request and it feels like a bug, but then again this is really the first time I've used Laravel or one of it's packages, so maybe I'm missing something? This function explicitly sets reserved_at to null, and the Connection->prepareBindings() method doesn't do anything with the ?, it just leaves it as that value, so the query fails.
protected function buildDatabaseRecord($queue, $payload, $availableAt, $attempts = 0)
{
return ['queue' => $queue, 'attempts' => $attempts, 'reserved_at' => null, 'available_at' => $availableAt, 'created_at' => $this->currentTime(), 'payload' => $payload];
}
What am I missing? Everything just looks right to me an I'm kind of at a loss. I'm making this with PHP 7.4 in mind (for the time being). Maybe I'll try 8.1 to see if that changes anything with the Illuminate packages. Using MySQL 8 too.
Update: potentially relevant screenshot just before the error.
Update 2: I tried PHP 8.1 and latest Laravel 9 packages, didn't make a difference.
For more clarity on how I"m creating my QueueManager:
<?php $queue = new Queue;
$queue->addConnection([
'driver' => 'database',
'table' => ee('db')->dbprefix . 'dgq_jobs',
'queue' => 'default',
'retry_after' => 90,
'after_commit' => false,
]);
$databaseConfig = $provider->make('DatabaseConfig');
$queue->addConnector('database', function () use ($databaseConfig) {
$pdo = new PDO(
sprintf('mysql:host=%s; dbname=%s', $databaseConfig['host'], $databaseConfig['database']),
$databaseConfig['username'],
$databaseConfig['password']
);
$connection = new Connection($pdo);
$connectionResolver = new ConnectionResolver(['default' => $connection]);
$connectionResolver->setDefaultConnection('default');
return new DatabaseConnector($connectionResolver);
});
return $queue->getQueueManager();
I was able to reproduce the error you were seeing. I haven't looked too deeply but I think it may be due to the PDO object not setting up the connection exactly as the Illuminate Queue library expects.
This modification to using the Illuminate\Database library to create the connection solved the issue in my test environment:
$database = new \Illuminate\Database\Capsule\Manager;
$queue = new \Illuminate\Queue\Capsule\Manager;
$database->addConnection([
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'db_name',
'username' => 'username',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
]);
$queue->addConnector('database', function () use ($database) {
$connection = $database->getConnection();
$connectionResolver = new \Illuminate\Database\ConnectionResolver(['default' => $connection]);
$connectionResolver->setDefaultConnection('default');
return new \Illuminate\Queue\Connectors\DatabaseConnector($connectionResolver);
});
$queue->addConnection([
'driver' => 'database',
'table' => 'jobs_table',
'queue' => 'default',
'retry_after' => 90,
'after_commit' => false,
]);
$queue->getQueueManager()->push('SendEmail', ['message' => 'test']);
I have a VueJs form that uploads files. Validation is being handled by the Laravel back-end. The problem I have is that the Illuminate\Http\UploadedFile is not being removed from the request object for subsequent requests, and as such the validation for files is not working.
I am trying to reset the request parameters with $request->replace([]) but it does not work for the uploaded file.
app('log')->debug('Before replace');
app('log')->debug($request);
$request->replace([]);
app('log')->debug('After replace');
app('log')->debug($request);
Successful upload:
[2019-07-23 11:01:06] local.DEBUG: Before replace
[2019-07-23 11:01:06] local.DEBUG: array (
'name' => 'a',
'description' => 'a',
'resourceType' => 'sample',
'applicationTypes' =>
array (
0 => '1',
),
'authorities' =>
array (
0 => '1',
),
'file' =>
Illuminate\Http\UploadedFile::__set_state(array(
'test' => false,
'originalName' => 'blueprint.pdf',
'mimeType' => 'application/pdf',
'error' => 0,
'hashName' => NULL,
)),
)
When no file has been selected in subsequent requests, the file object is still present.
[2019-07-23 11:01:06] local.DEBUG: After replace
[2019-07-23 11:01:06] local.DEBUG: array (
'file' =>
Illuminate\Http\UploadedFile::__set_state(array(
'test' => false,
'originalName' => 'blueprint.pdf',
'mimeType' => 'application/pdf',
'error' => 0,
'hashName' => NULL,
)),
)
How can I remove the file for subsequent uploads?
Turned out the file was not being cleared in the Vue component after submission.
Actually, I'm using "standard" sessions manager config:
http://framework.zend.com/manual/current/en/modules/zend.session.manager.html
I want to use cache and save my session's data into server's cache (memcached) for improves performances and scalability.
I set php.ini like this (localhost memcached):
session.save_handler=memcached
session.save_path= "tcp://127.0.0.1"
and it show this error:
Warning: session_start(): Cannot find save handler 'memcached' - session startup failed in C:\Program Files (x86)\xampp\htdocs\Zend-application\vendor\zendframework\zendframework\library\Zend\Session\SessionManager.php on line 98
So, I don't understand how to configure my config/autoload/global.php and module/application/module.php. it's my first time that I want to implement memcached and caching in general. thanks, so much!
I tried to modify module/application/module.php like this:
---add session and cache ---
use Zend\Session\Config\SessionConfig;
use Zend\Session\Container;
use Zend\Cache\StorageFactory;
use Zend\Session\SaveHandler\Cache;
use Zend\Session\SessionManager;
use Zend\Session\Validator\HttpUserAgent;
use Zend\Session\Validator\RemoteAddr;
--- end session and cache ---
public function onBootstrap($e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$this->initSession(array(
'remember_me_seconds' => 180,
'use_cookies' => true,
'cookie_httponly' => true,
'validators' => array(
'Zend\Session\Validator\RemoteAddr',
'Zend\Session\Validator\HttpUserAgent',
'phpSaveHandler' => 'memcached',
'savePath' => 'tcp://127.0.0.1',
)
));
}
public function initSession($config)
{
$sessionConfig = new SessionConfig();
$sessionConfig->setOptions($config);
$sessionManager = new SessionManager($sessionConfig);
$sessionManager->getValidatorChain()
->attach(
'session.validate',
array(new HttpUserAgent(), 'isValid')
)
->attach(
'session.validate',
array(new RemoteAddr(), 'isValid')
);
$cache = StorageFactory::factory(array(
'adapter' => array(
'name' => 'memcached',
'options' => array(
'server' => '127.0.0.1',
),
)
));
$saveHandler = new Cache($cache);
$sessionManager->setSaveHandler($saveHandler);
$sessionManager->start();
Container::setDefaultManager($sessionManager);
}
but it shows this error:
Warning: ini_set() expects parameter 2 to be string, array given in C:\Program Files (x86)\xampp\htdocs\Zend-application\vendor\zendframework\zendframework\library\Zend\Session\Config\SessionConfig.php on line 88
Fatal error: Call to undefined method Zend\Stdlib\CallbackHandler::attach() in C:\Program Files (x86)\xampp\htdocs\Zend-application\module\Application\Module.php on line 68
this is my config/autoload/global.php
return array(
'db' => array(
'driver' => 'Pdo_Mysql',
'charset' => 'utf-8',
'dsn' => 'mysql:dbname=mydb;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
),
),
'session' => array(
'config' => array(
'class' => 'Zend\Session\Config\SessionConfig',
'options' => array(
'name' => 'zend-application',
),
),
'storage' => 'Zend\Session\Storage\SessionArrayStorage',
'validators' => array(
'Zend\Session\Validator\RemoteAddr',
'Zend\Session\Validator\HttpUserAgent',
),
),
);
Hoping it'll help someone, I resolved my issue. I'm working in Win7 enviroment and memcached doesn't work on it! I changed :
session.save_handler=memcached
session.save_path= "tcp://127.0.0.1"
to
session.save_handler=memcache
session.save_path= "tcp://127.0.0.1:11211"
I restored the "standard" session manager config and memcache works correctly. When I'll transfer the entire site to apache server, I'll change php.ini for using memcached.
http://framework.zend.com/manual/current/en/modules/zend.session.manager.html
This is the code, that I've added to config/main.php in my Yii 1.x application:
'mCache' => array(
'class' => 'system.caching.CMemCache',
'useMemcached'=>true,
'keyPrefix'=>'',
'hashKey'=>false,
'serializer'=>false,
'servers' => array(
array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 10000)
),
),
'session' => array(
'sessionName' => 'PHPSESSID',
'class' => 'CCacheHttpSession',
'autoStart' => true,
'cacheID' => 'mCache',
'cookieMode' => 'only',
'timeout' => 1200
),
What should I do next, to force Yii to use CMemCache, instead of default session storage?
I know this answer is old, but this configuration works
'memcacheConn'=>array(
'class'=>'CMemCache',
'servers'=>array(
array(
'host'=>'172.17.0.1',
'port'=>11211,
//'weight'=>60,
),
),
),
'session' => array(
'class' => 'CCacheHttpSession',
'autoStart' => true,
'cacheID' => 'memcacheConn',
'cookieMode' => 'allow',
'sessionName' => 'MYSSIONNAME',
),
Did you read introduction to CMemCache in Yii 1.x API documentation? I think you didn't. In first paragraphs of this document, you have an example, how to use CMemCache in Yii 1.x.
Change 'class'=>'CCacheHttpSession' into 'class'=>'CMemCache' in your session key of configuration file. And you don't have to register CMemCache as separate component, like you did in your example (mCache). You can configure it directly in session configuration key.
An example from Yii 1.x API documentation:
array
(
'components'=>array
(
'cache'=>array
(
'class'=>'CMemCache',
'servers'=>array
(
array
(
'host'=>'server1',
'port'=>11211,
'weight'=>60,
),
array
(
'host'=>'server2',
'port'=>11211,
'weight'=>40,
)
)
)
)
)
I just use database session with kohana3.2,and set the config file:
'database' => array(
'name' => 'session_name',
'encrypted' => TRUE,
'lifetime' => 24 * 3600,
'group' => 'write',
'table' => 'sessions',
'columns' => array(
'session_id' => 'session_id',
'last_active' => 'last_active',
'contents' => 'contents'
),
'gc' => 500,
),
But I got error:
Session_Exception [ 1 ]: Error reading session data.SYSPATH\classes\kohana\session.php [ 326 ]
I searched about this,but failed to find out a solution.Has anyone tried database session?
Thanks!
update:
All application config need to be placed in application/config/session.php,so I am wrong,sorry.Both system and modules config shouldnt be modified.
Did you resolve this? I had a similar issue and it was because I needed to set-up the sessions schema:
http://kohanaframework.org/3.2/guide/api/Session_Database
CREATE TABLE `sessions` (
`session_id` VARCHAR( 24 ) NOT NULL,
`last_active` INT UNSIGNED NOT NULL,
`contents` TEXT NOT NULL,
PRIMARY KEY ( `session_id` ),
INDEX ( `last_active` )
) ENGINE = MYISAM ;