| کانال توسعه‌دهندگان PHP |
1.68K subscribers
42 photos
1 video
56 links
⭕️ کانال توسعه‌دهندگان پی‌اچ‌پی (PHP) دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
Forwarded from Developix Support
با Migration Boost هاست‌ایران، برای مهاجرت به سرور ابری دوباره هزینه ترافیک نده! 🚀

با خرید اولین سرور ابری غیرساعتی از **هاست‌ایران**، بسته ترافیک هدیه مهاجرت به‌صورت خودکار برای سرویس شما فعال می‌شود:

✅ حداقل ۱۰۰ گیگابایت ترافیک هدیه مهاجرت
✅ افزایش حجم هدیه متناسب با ظرفیت دیسک اولیه
✅ ترافیک آپلود رایگان
✅ بدون محدودیت زمانی

سرور ابری هاست‌ایران را راه‌اندازی کنید و بکاپ‌ها، فایل‌ها و پایگاه داده خود را بدون دغدغه هزینه‌های پنهان ترافیک منتقل کنید.

👇 مشاهده پلن‌های سرور ابری هاست‌ایران
hostiran.club/Migration
hostiran.club/Migration
‍ساخت فرم لاگین امن با PHP با استفاده از password_hash 🔐

خیلی از پروژه‌های PHP هنوز از md5 یا sha1 برای ذخیره پسورد استفاده می‌کنن و این یعنی دردسر امنیتی 😅
بیایم یه لاگین ساده ولی استاندارد بسازیم که روی password_hash و password_verify سوار باشه؛ همون چیزی که توی داک رسمی PHP هم پیشنهاد شده:
php.net/manual/en/function.password-hash.php

ایده کلی اینه:

• سمت دیتابیس فقط hash پسورد ذخیره می‌شه، نه خود پسورد.
• برای ساخت یوزر جدید از password_hash استفاده می‌کنیم.
• برای لاگین از password_verify کمک می‌گیریم.
• بعد از لاگین موفق، یه session امن راه می‌ندازیم.

این یه مثال خیلی مینیمال و قابل‌استفاده توی پروژه‌های کوچیکه 👇

<?php
// config.php
$pdo = new PDO(
'mysql:host=localhost;dbname=test;charset=utf8mb4',
'db_user',
'db_pass',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);

// register.php - ساخت یوزر جدید
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
exit('ایمیل نامعتبر است');
}

if (strlen($password) < 8) {
exit('پسورد باید حداقل 8 کاراکتر باشد');
}

$hash = password_hash($password, PASSWORD_DEFAULT);

$stmt = $pdo->prepare('INSERT INTO users (email, password_hash) VALUES (:email, :hash)');
$stmt->execute([
':email' => $email,
':hash' => $hash,
]);

echo 'ثبت‌نام با موفقیت انجام شد ✅';
}

// login.php - لاگین یوزر
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';

$stmt = $pdo->prepare('SELECT id, password_hash FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$user || !password_verify($password, $user['password_hash'])) {
exit('ایمیل یا پسورد اشتباه است');
}

session_regenerate_id(true);
$_SESSION['user_id'] = $user['id'];

echo 'خوش اومدی! 🎉';
}


نکته‌ها و ترفندهای کوچیک ولی مهم:

• الگوریتم داخلی PASSWORD_DEFAULT ممکنه در آینده عوض بشه، ولی همون برای اکثر سناریوها عالیه.
• با password_needs_rehash می‌تونی موقع لاگین، hashهای قدیمی رو خودکار به نسخه‌ی جدیدتر migrate کنی (مثلاً وقتی cost رو عوض کردی).
• حتماً روی ستون پسورد توی دیتابیس حداقل طول 255 بگذار تا با تغییر الگوریتم‌های آینده مشکل نداشته باشی.
• از PDO prepared statement استفاده کن که جلوی SQL Injection رو بگیره، مثل همین نمونه.
• بعد لاگین، session_regenerate_id رو فراموش نکن تا Session Fixation اتفاق نیفته.

این الگو پایه‌ی خیلی از سیستم‌های auth امروزی توی PHP ـه و راحت می‌شه بعداً روش چیزهایی مثل remember me، محدودیت تلاش لاگین، و لاگ آدیت اضافه کرد.

امتحانش کن روی یه پروژه کوچیک، اگر جواب داد همون رو تمیزتر کن و بذار توی پروژه‌های اصلی‌ات 💻

🔖 #PHP #پی_اچ_پی #PHP #Authentication #Security #Password_Hashing #Login #PDO

👤 Developix

💎 Channel: @DevelopixPHP
👍4👎2
✴️ جست‌وجوی تکراری روی آرایه بزرگ توی حلقه

توی قطعه‌کد اول هر بار داخل حلقه array_search صدا زده شده؛ یعنی اگه ۱۰هزار تا یوزر داشته باشی و لیست بلاک‌ها هم بزرگ باشه، عملاً می‌زنی دیتای خودت رو با دست خودت دی‌داس می‌کنی 😅

توی نسخهٔ دوم، اول یه lookup table می‌سازیم و بعد توی حلقه فقط روی یه isset ساده چک می‌کنیم؛ هم خواناتر می‌شه هم از نظر Time Complexity از O(n×m) می‌آد پایین به O(n+m) و فشار روی CPU به‌شدت کمتر می‌شه.

اگر قراره داخل حلقه روی آرایه بزرگ سرچ کنی، قبلش ساختار داده‌ات رو برای lookup بهینه کن؛ معمولاً یه array_flip یا یه array_fill_keys درست‌حسابی، نصف bottleneck رو جمع می‌کنه.


🔖 #PHP #پی_اچ_پی

👤 Developix

💎 Channel: @DevelopixPHP
🔥4
‏یک قطعه‌کد زیر را در نظر بگیرید (زبان: PHP). تمرکز روی رفتار generator و ارجاع‌ها است.

به‌نظر شما خروجی اجرای این اسکریپت چیست؟

خروجی را دقیقاً همان‌طور که در ترمینال چاپ می‌شود (با ترتیب و جداکننده‌ها) حدس بزنید.

🔖 #PHP #پی_اچ_پی

👤 Developix

💎 Channel: @DevelopixPHP
🔥 پکیج: استاندارد PSR-11 برای Container

استاندارد PSR-11 فقط یه interface مشترک برای Containerهاست؛ خودش DI Container نیست، ولی باعث می‌شود بین فریم‌ورک‌ها و کتابخانه‌ها راحت‌تر سوییچ کنی ✅

هر کتابخانه‌ای که از PSR-11 پیروی کند، فقط با یک type-hint ساده مثل Psr\Container\ContainerInterface با هر Container سازگار می‌شود.

برای جزئیات بیشتر، خود استاندارد را این‌جا ببین:
لینک PSR Container

📥 دانلود: 1,102,739,550
⭐️ 10,032 علاقه‌مند

🔖 #PHP #پی_اچ_پی #PHP #PSR_11 #Container

💎 @DevelopixPHP
👍2
برنامه نویسی سوکت در PHP بخش اول

عبارت دیگر در ارتباط های غیر سوکت برای ارسال یک پالس از سمت سرور به سمت کلاینت نیاز داریم که ابتدا یک درخواست به سمت سرور بدهیم تا بعد پاسخ را دریافت کنیم ولی در ارتباط سوکت می توان مستقیم از سرور به کلاینت ( یا کلاینت ها ) درخواست ارسال کنیم.

تصویر زیر نمونه یک ارتباط مانا میان یک کلاینت و یک سرور ( دو node در سوکت ) روی یک پورت می باشد. این ارتباط با ارسال یک پالس از سمت سرور به کلاینت شروع می شود و در ادامه پس از گذشت زمان دو پالس از سمت کلاینت به سرور می آید.

https://gnutec.net/socket-programming-in-php-part-1/

🔖 #PHP #پی_اچ_پی

👤 ابوالفضل

💎 Channel: @DevelopixPHP
👍2
ارسال ایمیل تأیید ثبت‌نام، بازیابی رمز عبور یا نوتیفیکیشن سفارش، تقریباً توی هر پروژه‌ PHP جدی لازم می‌شود. این‌جا با هم یک ماژول ساده و تمیز با PHPMailer می‌سازیم که هم امن باشد، هم قابل‌گسترش. 😉

منبع اصلی‌ای که ایده‌ها ازش گرفته شده، داکیومنت رسمی و مثال‌های PHPMailer در گیت‌هاب است؛ حتماً ارزش یک نگاه عمیق‌تر را دارد. 🔍

۱️⃣ نصب PHPMailer با Composer
اول مطمئن شو روی سرور یا سیستم لوکال، Composer نصب است. بعد داخل رoot پروژه این دستور را بزن:
composer require phpmailer/phpmailer
حالا پوشه‌ vendor ساخته می‌شود و می‌توانی از Autoload استفاده کنی.

۲️⃣ ساخت یک کلاس EmailService تمیز
به‌جای این‌که هرجا لازم شد مستقیم شی‌ء PHPMailer بسازی، بهتر است یک کلاس سرویس داشته باشی تا کانفیگ SMTP فقط یک‌جا باشد و بعداً راحت عوض شود (مثلاً وقتی از Gmail رفتی روی Mailgun یا SMTP هاست).

یک فایل مثل EmailService.php بساز و ساختار را شبیه مثال زیر نگه دار 👇

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

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

class EmailService
{
private PHPMailer $mailer;

public function __construct()
{
$this->mailer = new PHPMailer(true);

// تنظیمات پایه SMTP
$this->mailer->isSMTP();
$this->mailer->Host = 'smtp.gmail.com';
$this->mailer->SMTPAuth = true;
$this->mailer->Username = 'your-email@gmail.com';
$this->mailer->Password = 'app-password-here';
$this->mailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$this->mailer->Port = 587;

$this->mailer->setFrom('no-reply@yourapp.test', 'Your App');
$this->mailer->isHTML(true);
$this->mailer->CharSet = 'UTF-8';
}

public function send(string $to, string $subject, string $htmlBody): bool
{
try {
$this->mailer->clearAllRecipients();
$this->mailer->addAddress($to);
$this->mailer->Subject = $subject;
$this->mailer->Body = $htmlBody;

return $this->mailer->send();
} catch (Exception $e) {
error_log('Mail error: ' . $e->getMessage());
return false;
}
}
}


🔐 نکته مهم: برای Gmail باید از App Password استفاده کنی (نه پسورد عادی اکانت). راهنماش توی صفحه‌ رسمی گوگل موجود است و بدون این کار معمولاً اتصال SMTP بلاک می‌شود.

۳️⃣ استفاده در سناریوی واقعی
مثلاً بعد از ثبت‌نام، یک لینک فعال‌سازی بفرست:

$emailService = new EmailService();
$activationLink = 'https://yourapp.test/activate?token=' . urlencode($token);
$html = "سلام  {$userName}!<br>برای فعال‌سازی حسابت روی لینک زیر کلیک کن:<br><a href='{$activationLink}'>فعال‌سازی حساب";
$emailService->send($userEmail, 'فعالسازی حساب کاربری', $html);

🧩 چند نکته‌ تجربی کوتاه:
- لاگ ارور را حتماً جایی ذخیره کن تا اگر روی سرور ایمیل نرسید، راحت‌تر دیباگ شود.
- محتوا را هم HTML نگه دار، هم یک نسخه‌ متن ساده برای سازگاری بهتر با بعضی کلاینت‌ها (قابلیت AltBody در PHPMailer).
- اطلاعات SMTP و پسوردها را داخل فایل env. نگه دار، نه مستقیم داخل کلاس.

در هر پروژه‌ جدید، داشتن یک EmailService آماده کلی زمان ذخیره می‌کند. اگر این ساختار را کمی برای خودت شخصی‌سازی کنی، عملاً یک ماژول ایمیل قابل‌استفاده مجدد برای تمام پروژه‌های PHP خواهی داشت. 🚀

🔖 #PHP #پی_اچ_پی #PHP #PHPMailer #Email #SMTP #Backend #Security

👤 Developix

💎 Channel: @DevelopixPHP
🚀 ‏LaraGram Brain منتشر شد!

از این به بعد برای ساخت ربات‌های تلگرام با فریم‌ورک LaraGram، لازم نیست حتماً خودتون دست به کد بشید؛ یا حتی با توسعه ربات تلگرامی آشنا باشید!

کافیه ایده و توضیحات پروژه‌ای که می‌خواید رو به یک ایجنت هوش‌مصنوعی بدید و باقی کار رو به خودش بسپارید. 🤖

‏LaraGram Brain یک MCP Server برای فریم‌ورک LaraGram هست که مجموعه‌ای از ابزارها و اسکیل‌ها رو در اختیار ایجنت‌های هوش‌مصنوعی قرار می‌ده تا بتونن پروژه رو بهتر بشناسن، پیاده‌سازی کنن، تست بگیرن و حتی مشکلاتش رو بررسی کنن.

از جمله امکاناتش:
• اجرای متدهای تلگرام در محیط Sandbox بدون ارسال واقعی
• دسترسی به Schema و مستندات Telegram
• بررسی ساختار و Queryهای دیتابیس
• مشاهده Logهای برنامه
• جست‌وجو در مستندات LaraGram
•‏ Skillهای مربوط به Bot، MTProto، TMA و Web Pages

فرقی نمی‌کنه پروژه‌تون یه ربات ساده باشه یا یک پروژه پیچیده با MTProto و TMA؛ توضیحاتش رو به ایجنت بدید و اجازه بدید کار رو خودش انجام بده.

لینک پروژه‌ها:
🧩 LaraGram
🧩 Brain

🔖 #TelegramBot #ربات #تلگرام

💎 Channel: @DevelopixRobot
❤3
🔥 پکیج: قراردادهای ترجمه سیمفونی

اگر کد PHP را برای چندزبانگی می‌نویسید، بهتر است منطق برنامه را به یک پیاده‌سازی مشخص ترجمه گره نزنید. پکیج Translation Contracts سیمفونی، قراردادهای مشترکی برای کار با ترجمه فراهم می‌کند تا وابستگی‌ها بر پایهٔ interface باشند، نه جزئیات اجرا.

برای کتابخانه‌هایی که باید با مترجم‌های مختلف سازگار بمانند، گزینهٔ قابل‌توجهی است. مستنداتش را در Packagist ببینید.

📥 دانلود: 802,393,817
⭐️ 2,585 علاقه‌مند

🔖 #PHP #پی_اچ_پی #PHP #Symfony #ترجمه

💎 @DevelopixPHP
👍2
این کد موقع اجرا چه خروجی‌ای می‌ده و مشکلش کجاست؟

🔖 #PHP #پی_اچ_پی

👤 Developix

💎 Channel: @DevelopixPHP