Workerman/MySQL

ملاحظة
لم يعد هذا المكتبة قيد الصيانة، يوصى باستخدام illuminate/database أو topthink/think-orm

الوصف

غالبًا ما تواجه البرامج المقيمة في الذاكرة عند استخدام mysql خطأ mysql gone away، وهذا بسبب فقدان الاتصال بين البرنامج وmysql لفترة طويلة، مما يؤدي إلى طرد الاتصال من الخادم. يمكن لفئة قاعدة البيانات هذه حل هذه المشكلة، عند حدوث خطأ mysql gone away، سيتم إعادة المحاولة تلقائيًا.

التبعيات

تعتمد فئة mysql على توسعتين هما pdo و pdo_mysql، عدم وجود أي من التوسعتين سيؤدي إلى ظهور خطأ Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in .....

لتشغيل الأمر من سطر الأوامر php -m، سيعرض جميع التوسعات المثبتة في php cli، إذا لم يكن هناك pdo أو pdo_mysql، يرجى تثبيتهما بنفسك.

أنظمة centos

PHP5.x

yum install php-pdo
yum install php-mysql

PHP7.x

yum install php70w-pdo_dblib.x86_64
yum install php70w-mysqlnd.x86_64

إذا لم تتمكن من العثور على اسم الحزمة، يرجى محاولة استخدام yum search php mysql للبحث.

أنظمة ubuntu/debian

PHP5.x

apt-get install php5-mysql

PHP7.x

apt-get install php7.0-mysql

إذا لم تتمكن من العثور على اسم الحزمة، يرجى محاولة استخدام apt-cache search php mysql للبحث.

هل لا يمكن تثبيت الطرق المذكورة أعلاه؟

إذا لم تتمكن من تثبيت الطرق المذكورة أعلاه، يرجى الرجوع إلى دليل workerman - الملحق - تثبيت التمديدات - الطريقة الثالثة تثبيت من المصدر

تثبيت Workerman/MySQL

الطريقة 1:

يمكنك التثبيت عبر composer، قم بتشغيل الأمر التالي من سطر الأوامر (مستودع composer في الخارج، قد تكون عملية التثبيت بطيئة جدًا).

composer require workerman/mysql

بعد نجاح الأمر أعلاه، سيتم إنشاء مجلد vendor، ثم قم بتضمينه في المشروع باستخدام autoload.php تحت vendor.

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

الطريقة 2:

قم بتحميل المصدر، ضع الدليل الذي تم فك ضغطه في مشروعك (في أي موقع)، ثم قم بتمرير مصدر الملف مباشرة.

require_once '/your/path/of/mysql-master/src/Connection.php';

ملاحظة

من المستحسن بشدة تهيئة اتصال قاعدة البيانات في استدعاء onWorkerStart، لتجنب تهيئة الاتصال قبل تشغيل Worker::runAll();، فإن الاتصال المهيأ قبل تشغيل Worker::runAll(); ينتمي إلى العملية الرئيسية، وسيتم وراثة هذا الاتصال من قبل العمليات الفرعية، ومشاركة اتصال قاعدة البيانات نفسه بين العملية الرئيسية والعمليات الفرعية ستؤدي إلى حدوث أخطاء.

مثال

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onWorkerStart = function($worker)
{
    // قم بتخزين مثيل db في متغير عالمي (يمكن أيضًا تخزينه في أحد الأعضاء الثابتة لبعض الفئات)
    global $db;
    $db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // احصل على مثيل db من خلال المتغير العالمي
    global $db;
    // تنفيذ SQL
    $all_tables = $db->query('show tables');
    $connection->send(json_encode($all_tables));
};
// تشغيل worker
Worker::runAll();

الاستخدام المحدد لـ MySQL/Connection

// تهيئة اتصال db
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');

// الحصول على جميع البيانات
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
// يعادل
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
// يعادل
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");

// الحصول على صف واحد من البيانات
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
// يعادل
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
// يعادل
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");

// الحصول على عمود واحد من البيانات
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
// يعادل
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
// يعادل
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");

// الحصول على قيمة واحدة
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
// يعادل
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
// يعادل
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");

// استعلام معقد
$db->select('*')->from('table1')->innerJoin('table2','table1.uid = table2.uid')->where('age > :age')->groupBy(array('aid'))->having('foo="foo"')->orderByASC/*orderByDESC*/(array('did'))
->limit(10)->offset(20)->bindValues(array('age' => 13));
// يعادل
$db->query('SELECT * FROM `table1` INNER JOIN `table2` ON `table1`.`uid` = `table2`.`uid`
WHERE age > 13 GROUP BY aid HAVING foo="foo" ORDER BY did LIMIT 10 OFFSET 20');

// إدخال
$insert_id = $db->insert('Persons')->cols(array(
    'Firstname'=>'abc',
    'Lastname'=>'efg',
    'Sex'=>'M',
    'Age'=>13))->query();
يعادل
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");

// تحديث
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// يعادل
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// يعادل
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");

// حذف
$row_count = $db->delete('Persons')->where('ID=9')->query();
// يعادل
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");

// معاملات
$db->beginTrans();
....
$db->commitTrans(); // أو $db->rollBackTrans();