سهل الاستخدام للغاية واستبدال فعال للذاكرة للتكرار غير الفعال لملفات JSON الكبيرة أو التدفقات لـ PHP >=7.2. انظر ليرة لبنانية؛ د. لا توجد تبعيات في الإنتاج باستثناء ext-json
الاختياري. README متزامن مع الكود
الجديد في الإصدار 1.2.0
- التكرار العودي
<?php
use JsonMachineItems;
// this often causes Allowed Memory Size Exhausted,
// because it loads all the items in the JSON into memory
- $users = json_decode(file_get_contents('500MB-users.json'));
// this has very small memory footprint no matter the file size
// because it loads items into memory one by one
+ $users = Items::fromFile('500MB-users.json');
foreach ($users as $id => $user) {
// just process $user as usual
var_dump($user->name);
}
الوصول العشوائي مثل $users[42]
ليس ممكنًا بعد. استخدم foreach
المذكور أعلاه وابحث عن العنصر أو استخدم مؤشر JSON.
قم بعد العناصر عبر iterator_count($users)
. تذكر أنه لا يزال يتعين عليك تكرار الأمر برمته داخليًا للحصول على العد، وبالتالي سيستغرق نفس الوقت تقريبًا الذي يستغرقه تكراره والعد يدويًا.
يتطلب ext-json
إذا تم استخدامه خارج الصندوق ولكنه لا يتطلب ذلك إذا تم استخدام وحدة فك ترميز مخصصة. انظر أجهزة فك التشفير.
اتبع سجل التغيير.
JSON Machine عبارة عن محلل دفق/سحب/تزايدي/كسول (أيًا كان ما تسميه) فعال وسهل الاستخدام وسريع JSON يعتمد على المولدات التي تم تطويرها لتدفقات أو مستندات JSON الطويلة بشكل غير متوقع. الميزات الرئيسية هي:
foreach
. لا توجد أحداث وعمليات الاسترجاعات.json_decode
الأصلي لفك تشفير عناصر مستند JSON افتراضيًا. انظر أجهزة فك التشفير. لنفترض أن fruits.json
يحتوي على مستند JSON الضخم هذا:
// fruits.json
{
"apple" : {
"color" : " red "
},
"pear" : {
"color" : " yellow "
}
}
ويمكن تحليلها بهذه الطريقة:
<?php
use JsonMachine Items ;
$ fruits = Items:: fromFile ( ' fruits.json ' );
foreach ( $ fruits as $ name => $ data ) {
// 1st iteration: $name === "apple" and $data->color === "red"
// 2nd iteration: $name === "pear" and $data->color === "yellow"
}
يتبع تحليل مصفوفة json بدلاً من كائن json نفس المنطق. سيكون المفتاح الموجود في foreach عبارة عن فهرس رقمي للعنصر.
إذا كنت تفضل أن يقوم JSON Machine بإرجاع المصفوفات بدلاً من الكائنات، فاستخدم new ExtJsonDecoder(true)
كوحدة فك ترميز.
<?php
use JsonMachine JsonDecoder ExtJsonDecoder ;
use JsonMachine Items ;
$ objects = Items:: fromFile ( ' path/to.json ' , [ ' decoder ' => new ExtJsonDecoder ( true )]);
إذا كنت تريد تكرار الشجرة الفرعية results
فقط في fruits.json
هذا:
// fruits.json
{
"results" : {
"apple" : {
"color" : " red "
},
"pear" : {
"color" : " yellow "
}
}
}
استخدم مؤشر JSON /results
كخيار pointer
:
<?php
use JsonMachine Items ;
$ fruits = Items:: fromFile ( ' fruits.json ' , [ ' pointer ' => ' /results ' ]);
foreach ( $ fruits as $ name => $ data ) {
// The same as above, which means:
// 1st iteration: $name === "apple" and $data->color === "red"
// 2nd iteration: $name === "pear" and $data->color === "yellow"
}
ملحوظة:
لا يتم تحميل قيمة
results
في الذاكرة مرة واحدة، ولكن يتم تحميل عنصر واحد فقط فيresults
في كل مرة. يكون دائمًا عنصرًا واحدًا في الذاكرة في كل مرة على المستوى/الشجرة الفرعية التي تقوم بتكرارها حاليًا. وبالتالي، فإن استهلاك الذاكرة ثابت.
تسمح مواصفات مؤشر JSON أيضًا باستخدام واصلة ( -
) بدلاً من فهرس صفيف محدد. يفسرها JSON Machine على أنها حرف بدل يطابق أي فهرس صفيف (وليس أي مفتاح كائن). يمكّنك هذا من تكرار القيم المتداخلة في المصفوفات دون تحميل العنصر بأكمله.
مثال:
// fruitsArray.json
{
"results" : [
{
"name" : " apple " ,
"color" : " red "
},
{
"name" : " pear " ,
"color" : " yellow "
}
]
}
للتكرار على جميع ألوان الفاكهة، استخدم مؤشر JSON "/results/-/color"
.
<?php
use JsonMachine Items ;
$ fruits = Items:: fromFile ( ' fruitsArray.json ' , [ ' pointer ' => ' /results/-/color ' ]);
foreach ( $ fruits as $ key => $ value ) {
// 1st iteration:
$ key == ' color ' ;
$ value == ' red ' ;
$ fruits -> getMatchedJsonPointer () == ' /results/-/color ' ;
$ fruits -> getCurrentJsonPointer () == ' /results/0/color ' ;
// 2nd iteration:
$ key == ' color ' ;
$ value == ' yellow ' ;
$ fruits -> getMatchedJsonPointer () == ' /results/-/color ' ;
$ fruits -> getCurrentJsonPointer () == ' /results/1/color ' ;
}
يمكنك تحليل قيمة عددية واحدة في أي مكان في المستند بنفس طريقة تحليل المجموعة. خذ بعين الاعتبار هذا المثال:
// fruits.json
{
"lastModified" : " 2012-12-12 " ,
"apple" : {
"color" : " red "
},
"pear" : {
"color" : " yellow "
},
// ... gigabytes follow ...
}
احصل على القيمة العددية لمفتاح lastModified
مثل هذا:
<?php
use JsonMachine Items ;
$ fruits = Items:: fromFile ( ' fruits.json ' , [ ' pointer ' => ' /lastModified ' ]);
foreach ( $ fruits as $ key => $ value ) {
// 1st and final iteration:
// $key === 'lastModified'
// $value === '2012-12-12'
}
عندما يعثر المحلل اللغوي على القيمة ويقدمها لك، فإنه يتوقف عن التحليل. لذا، عندما تكون قيمة عددية واحدة في بداية ملف أو دفق بحجم جيجابايت، فإنها تحصل على القيمة من البداية في وقت قصير جدًا وبدون استهلاك أي ذاكرة تقريبًا.
الاختصار الواضح هو:
<?php
use JsonMachine Items ;
$ fruits = Items:: fromFile ( ' fruits.json ' , [ ' pointer ' => ' /lastModified ' ]);
$ lastModified = iterator_to_array ( $ fruits )[ ' lastModified ' ];
يدعم الوصول إلى القيمة العددية الفردية مؤشرات المصفوفة في مؤشر JSON أيضًا.
من الممكن أيضًا تحليل عدة أشجار فرعية باستخدام مؤشرات JSON متعددة. خذ بعين الاعتبار هذا المثال:
// fruits.json
{
"lastModified" : " 2012-12-12 " ,
"berries" : [
{
"name" : " strawberry " , // not a berry, but whatever ...
"color" : " red "
},
{
"name" : " raspberry " , // the same ...
"color" : " red "
}
],
"citruses" : [
{
"name" : " orange " ,
"color" : " orange "
},
{
"name" : " lime " ,
"color" : " green "
}
]
}
للتكرار على جميع أنواع التوت والحمضيات، استخدم مؤشرات JSON ["/berries", "/citrus"]
. ترتيب المؤشرات لا يهم. سيتم تكرار العناصر حسب ترتيب ظهورها في المستند.
<?php
use JsonMachine Items ;
$ fruits = Items:: fromFile ( ' fruits.json ' , [
' pointer ' => [ ' /berries ' , ' /citruses ' ]
]);
foreach ( $ fruits as $ key => $ value ) {
// 1st iteration:
$ value == [ " name " => " strawberry " , " color " => " red " ];
$ fruits -> getCurrentJsonPointer () == ' /berries ' ;
// 2nd iteration:
$ value == [ " name " => " raspberry " , " color " => " red " ];
$ fruits -> getCurrentJsonPointer () == ' /berries ' ;
// 3rd iteration:
$ value == [ " name " => " orange " , " color " => " orange " ];
$ fruits -> getCurrentJsonPointer () == ' /citruses ' ;
// 4th iteration:
$ value == [ " name " => " lime " , " color " => " green " ];
$ fruits -> getCurrentJsonPointer () == ' /citruses ' ;
}
استخدم RecursiveItems
بدلاً من Items
عندما يكون من الصعب أو حتى من المستحيل التعامل مع بنية JSON باستخدام Items
ومؤشرات JSON أو عندما تكون العناصر الفردية التي تكررها كبيرة جدًا بحيث لا يمكن التعامل معها. من ناحية أخرى، فهو أبطأ بشكل ملحوظ من Items
، لذا ضع ذلك في الاعتبار.
عندما يواجه RecursiveItems
قائمة أو إملاء في JSON، فإنه يُرجع مثيلًا جديدًا لنفسه والذي يمكن بعد ذلك تكراره وتكرار الدورة. وبالتالي، لا يُرجع أبدًا مصفوفة أو كائن PHP، بل يُرجع فقط القيم العددية أو RecursiveItems
. لن يتم تحميل أي إملاء أو قائمة JSON بالكامل في الذاكرة مرة واحدة.
دعونا نرى مثالاً مع العديد والعديد من المستخدمين مع العديد والعديد من الأصدقاء:
// users.json
[
{
"username" : " user " ,
"e-mail" : " [email protected] " ,
"friends" : [
{
"username" : " friend1 " ,
"e-mail" : " [email protected] "
},
{
"username" : " friend2 " ,
"e-mail" : " [email protected] "
}
]
}
]
<?php
use JsonMachine RecursiveItems
$ users = RecursiveItems:: fromFile ( ' users.json ' );
foreach ( $ users as $ user ) {
/** @var $user RecursiveItems */
foreach ( $ user as $ field => $ value ) {
if ( $ field === ' friends ' ) {
/** @var $value RecursiveItems */
foreach ( $ value as $ friend ) {
/** @var $friend RecursiveItems */
foreach ( $ friend as $ friendField => $ friendValue ) {
$ friendField == ' username ' ;
$ friendValue == ' friend1 ' ;
}
}
}
}
}
إذا قمت بكسر تكرار لهذا المستوى الأعمق البطيء (أي تخطيت بعض
"friends"
عبرbreak
) وتقدمت إلى القيمة التالية (أيuser
التالي)، فلن تتمكن من تكرارها لاحقًا. يجب على JSON Machine تكرارها في الخلفية لتتمكن من قراءة القيمة التالية. ستؤدي مثل هذه المحاولة إلى استثناء المولد المغلق.
RecursiveItems
toArray(): array
إذا كنت متأكدًا من أن نسخة معينة من RecursiveItems تشير إلى بنية بيانات يمكن التحكم فيها بالذاكرة (على سبيل المثال، $friend)، فيمكنك استدعاء $friend->toArray()
، وسيتحول العنصر إلى مصفوفة PHP عادية.
advanceToKey(int|string $key): scalar|RecursiveItems
عند البحث عن مفتاح محدد في مجموعة (على سبيل المثال، 'friends'
في $user
)، فإنك لا تحتاج إلى استخدام حلقة وشرط للبحث عنه. بدلاً من ذلك، يمكنك ببساطة الاتصال $user->advanceToKey("friends")
. سوف يتكرر لك ويعيد القيمة عند هذا المفتاح. يمكن أن تكون متسلسلة المكالمات. كما أنه يدعم بناء جملة مثل المصفوفة للتقدم إلى المؤشرات التالية والحصول عليها. لذلك سيكون $user['friends']
اسمًا مستعارًا لـ $user->advanceToKey('friends')
. يمكن أن تكون متسلسلة المكالمات. ضع في اعتبارك أنه مجرد اسم مستعار - فلن تتمكن من الوصول العشوائي إلى المؤشرات السابقة بعد استخدامه مباشرة على RecursiveItems
. انها مجرد سكر بناء الجملة. استخدم toArray()
إذا كنت بحاجة إلى الوصول العشوائي إلى المؤشرات الموجودة في السجل/العنصر.
وبالتالي يمكن تبسيط المثال السابق على النحو التالي:
<?php
use JsonMachine RecursiveItems
$ users = RecursiveItems:: fromFile ( ' users.json ' );
foreach ( $ users as $ user ) {
/** @var $user RecursiveItems */
foreach ( $ user [ ' friends ' ] as $ friend ) { // or $user->advanceToKey('friends')
/** @var $friend RecursiveItems */
$ friendArray = $ friend -> toArray ();
$ friendArray [ ' username ' ] === ' friend1 ' ;
}
}
يتيح لك التسلسل القيام بشيء مثل هذا:
<?php
use JsonMachine RecursiveItems
$ users = RecursiveItems:: fromFile ( ' users.json ' );
$ users [ 0 ][ ' friends ' ][ 1 ][ ' username ' ] === ' friend2 ' ;
RecursiveItems implements RecursiveIterator
لذلك يمكنك على سبيل المثال استخدام أدوات PHP المضمنة للعمل على RecursiveIterator
مثل تلك:
إنها طريقة لمعالجة عنصر واحد في مستند JSON. راجع JSON Pointer RFC 6901. إنه مفيد جدًا، لأنه في بعض الأحيان تتعمق بنية JSON، وتريد تكرار شجرة فرعية، وليس المستوى الرئيسي. لذا، ما عليك سوى تحديد المؤشر إلى مصفوفة أو كائن JSON (أو حتى إلى القيمة العددية) التي تريد تكرارها ثم انطلق. عندما يصل المحلل اللغوي إلى المجموعة التي حددتها، يبدأ التكرار. يمكنك تمريره كخيار pointer
في جميع وظائف Items::from*
. إذا قمت بتحديد مؤشر إلى موضع غير موجود في المستند، فسيتم طرح استثناء. ويمكن استخدامه للوصول إلى القيم العددية كذلك. يجب أن يكون مؤشر JSON نفسه سلسلة JSON صالحة . يتم إجراء المقارنة الحرفية للرموز المرجعية (الأجزاء الموجودة بين الخطوط المائلة) مقابل مفاتيح مستند JSON/أسماء الأعضاء.
بعض الأمثلة:
قيمة مؤشر JSON | سوف تتكرر من خلال |
---|---|
(سلسلة فارغة - افتراضية) | سيتم تكرار ["this", "array"] أو {"a": "this", "b": "object"} (المستوى الرئيسي) |
/result/items | {"result": {"items": ["this", "array", "will", "be", "iterated"]}} |
/0/items | [{"items": ["this", "array", "will", "be", "iterated"]}] (يدعم مؤشرات المصفوفات) |
/results/-/status | {"results": [{"status": "iterated"}, {"status": "also iterated"}]} (واصلة كحرف بدل لفهرس المصفوفة) |
/ (مسكتك! - شرطة مائلة متبوعة بسلسلة فارغة، راجع المواصفات) | {"":["this","array","will","be","iterated"]} |
/quotes" | {"quotes"": ["this", "array", "will", "be", "iterated"]} |
قد تغير الخيارات كيفية تحليل JSON. صفيف الخيارات هو المعلمة الثانية لجميع وظائف Items::from*
. الخيارات المتاحة هي:
pointer
- سلسلة مؤشر JSON تخبرك بجزء المستند الذي تريد تكراره.decoder
- مثيل لواجهة ItemDecoder
.debug
- true
أو false
لتمكين وضع التصحيح أو تعطيله. عند تمكين وضع التصحيح، تتوفر بيانات مثل السطر والعمود والموضع في المستند أثناء التحليل أو في الاستثناءات. يؤدي إبقاء تصحيح الأخطاء معطلاً إلى إضافة ميزة طفيفة في الأداء. يتم تحليل استجابة واجهة برمجة تطبيقات الدفق أو أي دفق JSON آخر تمامًا بنفس طريقة تحليل الملف. والفرق الوحيد هو أنك تستخدم Items::fromStream($streamResource)
لذلك، حيث يكون $streamResource
هو مورد الدفق مع مستند JSON. والباقي هو نفسه كما هو الحال مع تحليل الملفات. فيما يلي بعض الأمثلة لعملاء http المشهورين الذين يدعمون استجابات البث:
يستخدم Guzzle التدفقات الخاصة به، ولكن يمكن تحويلها مرة أخرى إلى تدفقات PHP عن طريق استدعاء GuzzleHttpPsr7StreamWrapper::getResource()
. قم بتمرير نتيجة هذه الوظيفة إلى وظيفة Items::fromStream
، وبذلك تكون جاهزًا. راجع مثال GuzzleHttp العامل.
تعمل استجابة التدفق الخاصة بـ Symfony HttpClient كمكرر. ولأن JSON Machine يعتمد على التكرارات، فإن التكامل مع Symfony HttpClient بسيط للغاية. راجع مثال HttpClient.
debug
) قد يستغرق تحليل المستندات الكبيرة بعض الوقت. استدعاء Items::getPosition()
في foreach
الخاص بك للحصول على العدد الحالي للبايتات التي تمت معالجتها من البداية. ومن ثم يسهل حساب النسبة المئوية position / total * 100
. لمعرفة الحجم الإجمالي للمستند الخاص بك بالبايت، قد ترغب في التحقق من:
strlen($document)
إذا قمت بتحليل سلسلةfilesize($file)
إذا قمت بتحليل ملفContent-Length
إذا قمت بتحليل استجابة دفق http إذا تم debug
، getPosition()
يُرجع دائمًا 0
.
<?php
use JsonMachine Items ;
$ fileSize = filesize ( ' fruits.json ' );
$ fruits = Items:: fromFile ( ' fruits.json ' , [ ' debug ' => true ]);
foreach ( $ fruits as $ name => $ data ) {
echo ' Progress: ' . intval ( $ fruits -> getPosition () / $ fileSize * 100 ) . ' % ' ;
}
تقبل وظائف Items::from*
أيضًا خيار decoder
. يجب أن يكون مثيلاً لـ JsonMachineJsonDecoderItemDecoder
. إذا لم يتم تحديد أي شيء، فسيتم استخدام ExtJsonDecoder
افتراضيًا. يتطلب وجود امتداد PHP ext-json
، لأنه يستخدم json_decode
. عندما لا يفعل json_decode
ما تريد، قم بتنفيذ JsonMachineJsonDecoderItemDecoder
واصنعه بنفسك.
ExtJsonDecoder
- افتراضي. يستخدم json_decode
لفك تشفير المفاتيح والقيم. يمتلك المُنشئ نفس المعلمات مثل json_decode
.
PassThruDecoder
- لا يوجد فك تشفير. يتم إنتاج كل من المفاتيح والقيم كسلاسل JSON خالصة. يكون مفيدًا عندما تريد تحليل عنصر JSON مع شيء آخر مباشرةً في foreach ولا تريد تنفيذ JsonMachineJsonDecoderItemDecoder
. منذ 1.0.0
لا يستخدم json_decode
.
مثال:
<?php
use JsonMachine JsonDecoder PassThruDecoder ;
use JsonMachine Items ;
$ items = Items:: fromFile ( ' path/to.json ' , [ ' decoder ' => new PassThruDecoder ]);
ErrorWrappingDecoder
- مصمم يغلف أخطاء فك التشفير داخل كائن DecodingError
مما يمكّنك من تخطي العناصر المشوهة بدلاً من الموت عند استثناء SyntaxError
. مثال: <?php
use JsonMachine Items ;
use JsonMachine JsonDecoder DecodingError ;
use JsonMachine JsonDecoder ErrorWrappingDecoder ;
use JsonMachine JsonDecoder ExtJsonDecoder ;
$ items = Items:: fromFile ( ' path/to.json ' , [ ' decoder ' => new ErrorWrappingDecoder ( new ExtJsonDecoder ())]);
foreach ( $ items as $ key => $ item ) {
if ( $ key instanceof DecodingError || $ item instanceof DecodingError) {
// handle error of this malformed json item
continue ;
}
var_dump ( $ key , $ item );
}
منذ 0.4.0، يمتد كل استثناء إلى JsonMachineException
، لذا يمكنك اكتشاف ذلك لتصفية أي خطأ من مكتبة JSON Machine.
إذا كان هناك خطأ في أي مكان في دفق json، فسيتم طرح استثناء SyntaxError
. وهذا أمر غير مريح للغاية، لأنه إذا كان هناك خطأ داخل عنصر json واحد، فلن تتمكن من تحليل بقية المستند بسبب وجود عنصر واحد تالف. ErrorWrappingDecoder
عبارة عن أداة ديكور لوحدة فك التشفير يمكنها مساعدتك في ذلك. قم بلف وحدة فك ترميز به، وسيتم إعطاؤك جميع العناصر المشوهة التي تقوم بتكرارها في foreach عبر DecodingError
. بهذه الطريقة يمكنك تخطيها والاستمرار في المستند. انظر المثال في أجهزة فك التشفير المتوفرة. ستستمر أخطاء بناء الجملة في بنية دفق json بين العناصر المتكررة في طرح استثناء SyntaxError
بالرغم من ذلك.
التعقيد الزمني هو دائما O(n)
TL;DR: تعقيد الذاكرة هو O(2)
يقرأ جهاز JSON دفقًا (أو ملفًا) عنصر JSON واحدًا في كل مرة ويقوم بإنشاء عنصر PHP واحد مطابق في المرة الواحدة. هذه هي الطريقة الأكثر فعالية، لأنه إذا كان لديك 10000 مستخدم في ملف JSON وأردت تحليله باستخدام json_decode(file_get_contents('big.json'))
، فستكون لديك السلسلة بأكملها في الذاكرة بالإضافة إلى جميع الـ 10000 هياكل PHP. والجدول التالي يوضح الفرق:
سلسلة العناصر في الذاكرة في وقت واحد | عناصر PHP التي تم فك تشفيرها في الذاكرة في كل مرة | المجموع | |
---|---|---|---|
json_decode() | 10000 | 10000 | 20000 |
Items::from*() | 1 | 1 | 2 |
وهذا يعني أن آلة JSON تتسم بالكفاءة باستمرار لأي حجم من ملفات JSON المعالجة. 100 جيجا مافيه مشكلة
TL;DR: تعقيد الذاكرة هو O(n+1)
هناك أيضًا طريقة Items::fromString()
. إذا اضطررت إلى تحليل سلسلة كبيرة، ولم يكن الدفق متاحًا، فقد يكون JSON Machine أفضل من json_decode
. والسبب هو أنه على عكس json_decode
، لا تزال JSON Machine تعبر عنصرًا واحدًا في سلسلة JSON في كل مرة ولا تقوم بتحميل جميع بنيات PHP الناتجة في الذاكرة مرة واحدة.
دعنا نواصل المثال مع 10000 مستخدم. هذه المرة هم جميعا في سلسلة في الذاكرة. عند فك تشفير تلك السلسلة باستخدام json_decode
، يتم إنشاء 10000 مصفوفة (كائنات) في الذاكرة ثم يتم إرجاع النتيجة. من ناحية أخرى، تقوم آلة JSON بإنشاء بنية واحدة لكل عنصر تم العثور عليه في السلسلة وتعيده إليك. عندما تقوم بمعالجة هذا العنصر والتكرار إلى العنصر التالي، يتم إنشاء بنية واحدة أخرى. هذا هو نفس السلوك كما هو الحال مع التدفقات/الملفات. الجدول التالي يضع المفهوم في منظوره الصحيح:
سلسلة العناصر في الذاكرة في وقت واحد | عناصر PHP التي تم فك تشفيرها في الذاكرة في كل مرة | المجموع | |
---|---|---|---|
json_decode() | 10000 | 10000 | 20000 |
Items::fromString() | 10000 | 1 | 10001 |
والواقع أفضل. Items::fromString
تستهلك حوالي 5x ذاكرة أقل من json_decode
. والسبب هو أن بنية PHP تستهلك ذاكرة أكبر بكثير من تمثيل JSON المقابل لها.
قد يكون أحد الأسباب هو أن العناصر التي تريد التكرار عليها موجودة في بعض المفاتيح الفرعية مثل "results"
ولكنك نسيت تحديد مؤشر JSON. راجع تحليل الشجرة الفرعية.
قد يكون السبب الآخر هو أن أحد العناصر التي تكررها هو في حد ذاته ضخم جدًا بحيث لا يمكن فك تشفيره مرة واحدة. على سبيل المثال، تقوم بالتكرار على المستخدمين ويشتمل أحدهم على آلاف كائنات "الأصدقاء". الحل الأكثر فعالية هو استخدام التكرار العودي.
ربما يعني ذلك أن سلسلة JSON العددية نفسها كبيرة جدًا بحيث لا يمكن احتواؤها في الذاكرة. على سبيل المثال، ملف كبير جدًا بتشفير base64. في هذه الحالة، من المحتمل أنك ستظل غير محظوظ حتى تدعم JSON Machine إنتاج القيم العددية كتدفقات PHP.
composer require halaxa/json-machine
انسخ هذا المستودع أو قم بتنزيله وأضف ما يلي إلى ملف التمهيد الخاص بك:
spl_autoload_register ( require ' /path/to/json-machine/src/autoloader.php ' );
استنساخ هذا المستودع. تدعم هذه المكتبة طريقتين للتطوير:
قم بتشغيل composer run -l
في دليل المشروع لرؤية البرامج النصية المتاحة للتطوير. بهذه الطريقة يمكنك تشغيل بعض خطوات عملية الإنشاء مثل الاختبارات.
قم بتثبيت Docker وتشغيل make
في دليل المشروع على جهازك المضيف لرؤية أدوات/أوامر التطوير المتاحة. يمكنك تشغيل جميع خطوات عملية الإنشاء بشكل منفصل بالإضافة إلى عملية الإنشاء بأكملها مرة واحدة. يقوم بشكل أساسي بتشغيل البرامج النصية لتطوير الملحن داخل الحاويات في الخلفية.
make build
: تشغيل الإنشاء الكامل. يتم تشغيل نفس الأمر عبر GitHub Actions CI.
هل تحب هذه المكتبة؟ قم بتمييزها بنجمة ومشاركتها وإظهارها :) نرحب جدًا بالمشكلات وطلبات السحب.
أباتشي 2.0
عنصر العجلة المسننة: الأيقونات التي صنعتها TutsPlus من www.flaticon.com مرخصة بواسطة CC 3.0 BY
جدول المحتويات الذي تم إنشاؤه باستخدام Markdown-toc