Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Смотря сколько слушателей, если слушатель один, то он будет выполнять последовательно задания. А вот если например два слушателя, то грубо говорят первый возьмет первое задание, а второй второе и т.д.
Вообще если нужна зависимость между заданиями т.е. второе задание нужно выполнить только если первое выполнилось, то это можно указать через цепочки - https://laravel.com/docs/10.x/queues#job-chaining
Думаю сделать это очередями Laravel, но боюсь за скорость ответа.
Скорость ответа тут подразумевается, чтобы уложится в стандартные 30 сек. на запрос или что?
Вообще я бы ответ получал через websocket. Например перешли на страницу где надо выводит ответ/результат парсеров, в очередь кинулись несколько задании на парсинг и слушатели, после того как выполнили через websocket отдали бы ответ/результат парсинга на фронт. А тем временем на странице какой-нибудь loading... с сообщением, что идет обработка.
Ну а скорость обработки будет зависит:
От того как часто проверяет слушатель наличие задании в очереди, есть такой параметр sleep, что-ли, он по умолчанию 1, т.е. слушатель засыпает на секунду, таким образом снижается нагрузка на железо, но если надо как можно быстрее преступить к обработки и есть ресурсы можно поставить 0.
И от кол-ва слушателей и распределения между ними задании, например у тебя есть 10 задании, а слушателей только 5, соответственно 5 сразу начнут обрабатываться, а следующие по освобождению. А вот если 10 заданий и 10 слушателей, то все параллельно начнут выполнятся. Но тут тоже есть параметры, которые надо подстроить, чтобы один слушатель не забрал себе все задания, а остальные простаивали бы.
Надо еще прочитать как делаются связи — eloquent-relationships.
Надо при выборке указать, что нужно достать модель со связью otdName
$listOrg = ListTech::with('otdName')->where('inv_num', $inv)->get();
$listOrg->otdName->name; // Тут будет имя
А вообще надо менять products() — это описание связи «один ко многим» и тут опушены указание полей в таблицах, т.к. их название совпадают с названиями по умолчанию. Т.е. мы можем products() записать так:
public function products()
{
return $this->hasMany(Product::class, 'category_id', 'id');
}
Т.е. в таблице с товарами есть колонка category_id в ней id категории к которой относится товар. Т.е. нам надо указать id категории не только родительской, но всех дочерних категории.
Я бы начал решать эту задачу с SQL запроса, т.е. какой должен получится запрос. Если появится понимание на уровне БД какой должен получится запрос, то и тут легче будет разобратся.
Если name вообще планиурется не присылать то можно использовать правило sometimes.
public function rules()
{
return [
'name' => 'sometimes|min:2|max:25',
'subject' => 'sometimes|min:2|max:25',
'email' => 'sometimes|email',
'content' => 'required|min:2',
];
}
Если же name постоянно будет приходит, но в случае, когда оно не нужно оно равно пустой строке или null, тогда тут подойдет правило nullable
public function rules()
{
return [
'name' => 'nullable|min:2|max:25',
'subject' => 'nullable|min:2|max:25',
'email' => 'nullable|email',
'content' => 'required|min:2',
];
}
Ну и оф. документации для подробностей, а вообще есть еще вот хорошая статья про различия nullable и sometimes — статья
Вообще впринципе в php есть такая функция php_sapi_name с помощью нее можно поределить консоль это или нет. Примерно так:
if (strpos(php_sapi_name(), 'cli') !== false) {
// Работает в консоле
}
На чем пишите тесты? Используете какой-либо фреймворк например codeception или то, что идет из коробки с laravel?
Так вроде же есть ошибка конкретная - не существует класс App\Http\Kernel
Class App\Http\Kernel does not exist
Посмотрите существует он или нет?
А как Вы перекинули?
@Proger_XP дак как бы Вы написали валидатор, если бы Вам поставили задачу, пропускать файл только меньше 5 Мегабайт, так:
'max:5120'
или так:
'max:5000'
Вроде как всегда было 1 Кбайт = 1024 байт, но например тот же онлайн калькулятор от google использует правило 1 Кбайт = 1000 байт, понятно, что это некий холивар, но интересно Ваше мнение, кто как делает?
Тут мне кажется нужен хороший фронтендер знающий vue js, node js, т.е. тут laravel то не влияет. С моей backend-ерской точки зрения у Вас получается некий процесс на node js, который постоянно слушает ws://localhost:8081. А сам проект работал на h ttp://local-ads-backend8.com:80 или h ttp://127.0.0.1:8000, дак вот как он там на фронте узнает адрес ws://localhost:8081, может он берет основной адрес и просто добавляет порт 8081. Тогда он пытался ходить по ws://local-ads-backend8.com:8081 и ws://127.0.0.1:8081, но это не ws://localhost:8081. Может Вам попробовать запустить проект на домене localhost ?!
А кодировка файлов проектов одинаковая? Возможно в 7 - utf-8, а в 8 - windows1251. И в 8-ке он не может норм получить часть пути, которая:
„ҐЁб
Проверьте еще кодировку
ОС windows
Еще же тот путь, что используется для записи, изначально вроде скрыть, т.е. когда заходишь в папку пользователя то не видишь папки AppData. Т.е. может тут на уровне windows какая-то защита от записи в эту папку. Я считаю не очень удачно начинать учебный проект на базе windows т.к. будете спотыкаться об нюансы, которых на "продакшн" не бывает (не слышал, что бы кто-то реальный проект запустил в OS отличной от Linux) и тратить на них время вместо изучения фреймворка.
Попробуйте проставить папке права 777 и снова запустить tinker и если он заработает то точно дело в правах
chmod -R 777 полный_путь_до_папки
Вообще я нашел решение, еще 24.01.2021. Вот тут https://laravel.com/docs/8.x/eloquent-r … phic-types есть описание как сделать типы кастомными и предлагается как вариант разместить их в App\Providers\AppServiceProvider, дак вот их можно также разместить динамически в каждый из методов thumbnail(), optimized() и .т.д. Т.е получится примерно такое:
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\Relation;
class File extends Model
{
public function thumbnail()
{
Relation::morphMap([
'thumbnail' => 'App\Models\File',
]);
return $this->morphToMany(
self::class,
'file',
'file_file_assoc',
'parent_id',
'child_id',
'id',
'id'
);
}
public function optimized()
{
Relation::morphMap([
'optimized' => 'App\Models\File',
]);
...
}
}
а на счет прав на папку Writing to directory C:/Users/„ҐЁб/AppData/Roaming/PsySH is not allowed. я так понимаю вот тут на скрине у нее полные права? Т.е. проблема не в правах? Картинка тут
На скрине видно, что на запись есть права у пользователя Denis, а для остальных нет прав на запись. Дак вот когда Вы запускаете tinker, под каким пользователем он пытается туда писать?
Тут скорее всего проблемы в медленных запросах к БД, а не в коде контроллера, глядя только на код контроллера никто ничего не подскажет, надо структуру БД, затем какие запросы получаются. А еще в коде видно использование Cache::remember т.е. тот кто его писал уже знал, что есть проблемы с быстродействием и пытался, что-то закэшировать и вот когда кэша нет все тормозит.
Есть 2 таблицы - таблица картинок и таблица связи картинки с картинкой.
Например заливаем картинку, делаем запись о ней в первую таблицу, затем делаем для нее thumbnail это тоже картинка пишем о ней также в первую таблицу, теперь надо знать, что на первую оригинальную картинку есть thumbnail и они связываются под средством второй таблицы. Также в дальнейшем оригинальная картинка еще может обрабатываться и на выходе получатся оптимизированный вариант, также она может перегоняться в формат pdf, т.е. получается на 1 оригинальную картинку в итоге получается несколько других связанных с оригинальной.
Таблица files
Column | Type | Description
--------------+--------------------------------+------------------------
id | bigint |
path | character varying(512) | Путь до файла
created_at | timestamp(0) without time zone |
Таблица file_file_assoc
Column | Type | Description
-----------+------------------------+----------------------------------------------------------------------------------------------------------
parent_id | bigint | id оригинального изображения
child_id | bigint | id thumbnail, оптимизированного или pdf изображения
file_type | character varying(255) | Указывает на то чем является child_id файл по отношению к parent_id - миниатюра, склеенный pdf, оптимизированный
Indexes:
"file_file_assoc_pkey" PRIMARY KEY, btree (parent_id, file_type)
Пример данных:
id | path | created_at
------+-----------------------------------------------------+---------------------
2015 | /api/file/20/12/14/0007/2012140007_15.jpeg | 2021-01-22 22:38:17
2016 | /api/file/20/12/14/0007/2012140007_01.jpeg | 2021-01-22 23:12:55
2022 | /api/file/20/12/14/0007/opt/2012140007_15.jpeg | 2021-01-22 23:23:50
2023 | /api/file/20/12/14/0007/opt/2012140007_01.jpeg | 2021-01-22 23:27:28
2024 | /api/file/20/12/14/0007/thumbnail/2012140007_02.jpg | 2021-01-22 23:36:30
2025 | /api/file/20/12/14/0007/thumbnail/2012140007_03.jpg | 2021-01-22 23:42:37
parent_id | child_id | file_type
-----------+----------+-----------
2015 | 2022 | optimized
2016 | 2023 | optimized
2015 | 2024 | thumbnail
2016 | 2025 | thumbnail
Есть модель File:
namespace App\Models;
class File extends Model
{
public function thumbnail()
{
return $this->morphToMany(
self::class,
'file',
'file_file_assoc',
'parent_id',
'child_id',
'id',
'id'
);
}
public function optimized()
{
...
}
}
Т.е. например для картинки (id=2017) чтобы выбрать thumbnail нужен подобный запрос:
SELECT files.*
FROM file_file_assoc
JOIN files ON files.id = file_file_assoc.child_id
WHERE file_file_assoc.parent_id = 2017 and file_file_assoc.file_type = 'thumbnail';
А для выбора optimized, тоже самое только меняется file_type.
Как мне описать relation thumbnail() и optimized(), чтобы была возможность подобного выбора миниатюр, оптимизированных вариантов и т.д. ? Т.е. как мне получить это через ORM ? Я вижу, что это похоже на https://laravel.com/docs/master/eloquen … ationships, но как конкретно это сделать!?