<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 1. Создаем уникальный ключ для этого конкретного запроса
$lockKey = 'request_lock:' . md5(json_encode($_REQUEST));
// 2. Пытаемся захватить ключ на 10 секунд
// Эта команда атомарная: только один процесс из двух победит.
$isLockAcquired = $redis->set($lockKey, '1', ['nx', 'ex' => 10]);
if ($isLockAcquired) {
// КЛЮЧ НАШ! Делаем свою работу
try {
// ... обращаемся к стороннему сервису, запускаем worker.php или ваще что угодно ...
// отвечаем клиенту об успехе операции
http_response_code(200);
echo json_encode(['status' => 'success']);
} catch(\Throwable $e) {
// Освобождаем ключ для будущих запросов в случае ошибки, чтобы не ждать 10с для переотправки.
$redis->del($lockKey);
// отвечаем клиенту, что произошла ошибка
http_response_code(500);
echo json_encode(['status' => 'error']);
}
} else {
// КЛЮЧ УЖЕ КЕМ-ТО ЗАНЯТ. Ничего не делаем.
// Просто отвечаем клиенту, что все ок или что запрос дублируется.
http_response_code(429); // Too Many Requests
echo json_encode(['status' => 'error', 'message' => 'Request already in progress']);
exit;
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
/**
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* Получить данные пользователя, связанные с этим пользователем.
*/
public function userData()
{
return $this->hasOne(UserData::class);
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class UserData extends Model
{
use HasFactory;
/**
* @var array<int, string>
*/
protected $fillable = [
'phone_number',
];
/**
* Получить пользователя, которому принадлежат эти данные.
*/
public function user()
{
return $this->belongsTo(User::class);
}
}
use App\Models\User;
use App\Models\UserData;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
DB::transaction(function () {
// 1. Создаем пользователя (User)
$user = User::create([
'name' => 'Вася Пупкин',
'email' => 'uasya@fsb.ru',
'password' => Hash::make('12345'),
]);
// 2. Создаем данные пользователя (UserData) и связываем их с пользователем
$user->userData()->create([
'phone_number' => '112',
]);
});
<?php if ($isSent): ?>
<p>Email sent successfully!</p>
<?php else: ?>
<form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
<label for="subject">Тема письма : </label> <br>
<input type="text" name="subject" size="30"> <br>
<label for="elvismail">Содержание письма : </label> <br>
<textarea name="elvismail" id="" cols="30" rows="10"></textarea> <br>
<input type="submit" name="submit">
</form>
<?php endif; ?>
все вычисления всегда выносить в отдельные функции, а эти функции всегда типизировать по-максимуму.
<?php
$sum = 400;
// Было
$all = $sum * (55 / 100);
var_dump($all); // На выходе float(220.00000000000003)
// Стало
$all2 = calculateAll($sum);
var_dump($all2); // На выходе int(220)
function calculateAll(int $sum): int
{
return $sum * (55 / 100);
}
float(220.00000000000003)
PHP Deprecated: Implicit conversion from float 220.00000000000003 to int loses precision in /Users/vitiok78/Downloads/float.php on line 12
Deprecated: Implicit conversion from float 220.00000000000003 to int loses precision in /Users/vitiok78/Downloads/float.php on line 12
int(220)
<?php
function getArrayValueByPath($array, $path, $separator = "/")
{
// Разбиваем путь на ключи
$keys = explode($separator, $path);
// Текущий уровень массива - начинаем с корня
$current = $array;
foreach ($keys as $key) {
// Если ключа нет в массиве, то выбрасываем исключение
if (!isset($current[$key])) {
throw new \Exception(
"Ключ $key не найден в массиве по адресу '$path'"
);
}
// Переходим к следующему уровню вложенности массива
$current = $current[$key];
}
// Возвращаем значение по заданному пути
return $current;
}
// Использование функции:
$arr = [
"k1" => [
"k2" => [
"k3" => [
"k4" => "v",
],
],
],
];
$result = getArrayValueByPath($arr, "k1/k2/k3");
var_dump($result);
/** Результат выполнения:
array(1) {
["k4"]=>
string(1) "v"
}
*/
SELECT * FROM products WHERE productid={нефильтрованный ID};
1; SELECT pg_sleep(25)
SELECT * FROM products WHERE productid=1; SELECT pg_sleep(25);