https://join.slack.com/t/yii/shared_invite/MjIxMjMxMTk5MTU1LTE1MDE3MDAwMzMtM2VkMTMyMjY1Ng
yii\base\Controller
versus yii\web\Controller
What is the best practice for using Access Tokens in apis?
$identity = self::find()->where(['access_token' => $token])->select('id')->one();
if ($identity == null) return null;
//As per the recommendations, https://www.yiiframework.com/doc/api/2.0/yii-web-identityinterface#findIdentityByAccessToken()-detail
// null should be re turned here.
if (!Yii::$app->authManager->checkAccess($identity->id, Permissions::IdentifyWithAccessToken))
return null;
return $identity;
this doesn't seem all that secure having it in plain text.
$model->link('organisationUsers', Yii::$app->user->identity, ['status' => 10, 'role' => 10]);
.in /app/vendor/yiisoft/yii2/db/BaseActiveRecord.php at line 1350– yii\db\BaseActiveRecord::bindModels(['organisation_id' => 'id'], common\models\User, common\models\Organisation)
.I have tried
'container' => [
'definitions' => [
yii\base\Model::class => app\models\Model::class,
but that doesn't do anything. The models dont have any of the app\models\Model::class
and are not instances of it
$model = TestModel::findOne(['id' => 3]);
$success = $model instanceof \app\models\Model;
if (!$success) Yii::$app->session->addFlash('danger', 'failed to override');
this always fails
Hey guys, I have a question regarding the yiisoft/yii2-queue and the monitor extension from Roman Zhuravlev. I need to implement a worker affinity for jobs.
I start worker using supervisor in docker container (1 or many):
[group:worker]
programs=yii-queue-worker
priority=40
[program:yii-queue-worker]
command=yii queue/listen --verbose=1 --php-binary=/usr/local/bin/php --isolate=1 --color=0 --interactive=0
process_name=%(program_name)s_%(process_num)02d
autostart=true
numprocs=5
autorestart=true
startsecs=14
startretries=20
user=application
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0
So I have 5 isolated queue listeners up and running in each container / host.
Now a job A was pushed for the first time and gets executed by worker A on host A.
Then I remember (using a simple key value store in redis) that job A was processed by worker A on host A.
Works fine so far and I can access that information everywhere.
Now the next time job A comes I need to ensure that this job A will only gets executed on worker A on host A.
Until worker A on host A is busy that job A needs to wait.
I tried a lot to get that done but job A gets always executed by one of the next free available worker process.
I use own extended classes doing nothing atm then calling the parent class methods to be able to customize.
Here`s my config:
'queue' => [
'class' => ProjectQueue::class,
'commandClass' => ProjectCommand::class,
'as log' => [
'class' => ProjectLogBehavior::class,
'autoFlush' => true,
],
'as jobMonitor' => [
'class' => ProjectJobMonitor::class,
],
'as workerMonitor' => [
'class' => ProjectWorkerMonitor::class,
],
'mutex' => [
'class' => MysqlMutex::class,
'db' => 'db',
'autoRelease' => false,
],
'mutexTimeout' => 10,
'db' => 'db',
'channel' => 'master-queue',
'deleteReleased' => true,
'ttr' => 200,
'attempts' => 1,
],
Now my question. Is that possible at all? And where I need to slide in to get that done.
Thanks in advance !
🎁 Yii news 2020, issue 8: https://opencollective.com/yiisoft/updates/yii-news-2020-issue-8
🎄 Happy New Year!
good day, i setup DBSession:
'session' => [
'class' => 'yii\web\DbSession',
'timeout' => 3600 * 4,
'writeCallback' => function($session)
{
return [
'user_id' => Yii::$app->user->isGuest ? null : Yii::$app->user->id,
'agent' => Yii::$app->request->userAgent,
'ip' => ip2long(Yii::$app->request->userIP),
];
}
],
create mysql table:
CREATE TABLE tbl_session
(
id
char(64) NOT NULL,
expire
int(11) DEFAULT NULL,
data
blob,
user_id
char(36) DEFAULT NULL,
agent
char(255) DEFAULT NULL,
ip
int(11) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
and when user is login user_id is ignored to insert to db, in debug i have request:
NSERT INTO tbl_session
(user_id
, agent
, ip
, data
, id
, expire
) VALUES ('ab44c918-81f3-46fc-9720-a168ce652729', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36', 168433921, 'flash|a:0:{}returnUrl|s:26:\"\";id|s:36:\"ab44c918-81f3-46fc-9720-a168ce652729\";authKey|s:12:\"a168ce652729\";', 'ha5gmmtpatjou0', 1638538767) ON DUPLICATE KEY UPDATE agent
=VALUES(agent
), ip
=VALUES(ip
), data
=VALUES(data
)
I think this has to do with a missing PRIMARY or UNIQUE KEY in your database table schema:
https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
thanks for your message, problem is solved. user_id was foreign key.