<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های behnam hoseyni</title>
        <link>https://virgool.io/feed/@behnamtakta71</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-17 03:33:57</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/47224/avatar/avatar.png?height=120&amp;width=120</url>
            <title>behnam hoseyni</title>
            <link>https://virgool.io/@behnamtakta71</link>
        </image>

                    <item>
                <title>فعال سازی JIT در PHP 8</title>
                <link>https://virgool.io/@behnamtakta71/%D9%81%D8%B9%D8%A7%D9%84%D8%B3%D8%A7%D8%B2%DB%8C-jit-%D8%AF%D8%B1-php8-saukyuagm1nf</link>
                <description>همونطور که همگی میدونیم PHP در نسخه 8 کامپایلر JIT رو  به هسته خودش اضافه کرده که افزایش سرعت قابل توجهی رو همراهش داشته.راستش رو بخواید راه اندازی JIT یکی از گیج کننده ترین کانفیگ های مربوط به extension های PHP هست که تا به امروز دیدم،منتهی چند روش پیکربندی ساده تر هم وجود داره که باز هم برای انجامش باید در مورد پیکربندی JIT دانش عمیقی داشته باشیم، برای همین تو این مقاله با هم این موضوع رو  مورد بررسی قرار میدیم.اول از همه، JIT فقط در صورتی کار می کنه که Opcache فعال باشه که این مورد در اکثر نصب های PHP به صورت پیش فرض فعال است ولی برای اطمینان باید بررسی کنیم که در فایل php.ini   مقدارzend_extension برابر Opcache یعنی به این شکل(zend_extension=opcache) و مقدار opcache.enable برابر 1 باشه.بعد از اطمینان از فعال بود Opcache باید خود JIT رو فعال کنیم که این کار با مشخص کردن مقدار opcache.jit_buffer_size در فایل   php.ni  انجام میشه.توجه داشته باشید که اگر PHP رو از طریق خط فرمان اجرا می کنیم، می تونیم این گزینه ها را به جای اضافه کردنشون به php.ini از طریق تگ d- نیز ارسال کنیم:php -d opcache.enable=1 -dopcache.jit_buffer_size=100Mاگر این دستور  با مقدار پیش فرض یعنی  0 تنظیم بشه  JIT دیگه اجرا نمیشه.اگر بخوایم JIT رو فقط در محیط خط فرمان تست کنیم، باید به جای opcache.enable از مقدار opcache.enable_cli برای فعال کردن opcache استفاده کنیم:php -dopcache.enable_cli=1 -dopcache.jit_buffer_size=100Mاگر بخوام دقیق تر توضیح بدم تفاوت بین opcache.enable و opcache.enable_cli در اینه  که برای مثال اگه  از PHP روی سرور استفاده میکنیم باید از مورد اول و  اگه واقعاً یه اسکریپت CLI رو اجرا میکنیم باید از  opcache.enable_cli استفاده کنیم.قبل از ادامه، بیاید مطمئن شیم که JIT واقعاً کار می کنه، یه اسکریپت PHP با محتوای زیر  ایجاد میکنیم که از طریق مرورگر یا CLI قابل دسترسی باشد (بسته به جایی که JIT را تست می کنیم):var_dump(opcache_get_status()[&#039;jit&#039;]);خروجی باید چیزی شبیه این باشه:array(7) {[&amp;quotenabled&amp;quot]=&gt; bool(true)[&amp;quoton&amp;quot]=&gt; bool(true)[&amp;quotkind&amp;quot]=&gt;  int(5)[&amp;quotopt_level&amp;quot]=&gt;  int(5)[&amp;quotopt_flags&amp;quot]=&gt;  int(6)[&amp;quotbuffer_size&amp;quot]=&gt;  int(104857584)[&amp;quotbuffer_free&amp;quot]=&gt;  int(104854800)}اگر مقدار enable  و on برابر true باشن یعنی تا اینجا درست پیش رفتیم.در مرحله بعد، چندین راه برای پیکربندی JIT وجود داره ( اینجاست که ما به مشکل سختی پیکربندی میخوریم!). میتونیم  پیکربندی کنیم که JIT چه زمانی باید اجرا بشه، چقدر باید تلاش کنه تا بهینه بشه و غیره. همه این گزینه ها با استفاده از یک ورودی  پیکربندی میشن!opcache.enable=1opcache.jit=1255مقدار پیشفرض برابر 1205 هست که بهتره به 1235 تغییر کنه، این عدد متشکل از چهار رقمِ که هر عدد نماینده یک کانیفگ خاص از  مفهومی به نام CRTO هست.حالا معنی این عدد چیه؟ اگر به RFC مراجعه کنیم تمامی اعداد رو توضیح داده.باید توجه داشته باشیم این اعداد که به نظر فقط یه عدد میان میتونن کانفیگ رو به کل تغییر بدن.اینجا لیست CRTO رو داریم که در  RFC نوشته شده:O — Optimization level0 don&#039;t JIT1 minimal JIT (call standard VM handlers)2 selective VM handler inlining3 optimized JIT based on static type inference of individual function4 optimized JIT based on static type inference and call tree5 optimized JIT based on static type inference and inner procedure analyses#T — JIT trigger0 JIT all functions on first script load1 JIT function on first execution2 Profile on first request and compile hot functions on second request3 Profile on the fly and compile hot functions4 Compile functions with @jit tag in doc-comments5 Tracing JIT#R — register allocation0 don&#039;t perform register allocation1 use local liner-scan register allocator2 use global liner-scan register allocator#C — CPU specific optimization flags0 none1 enable AVX instruction generationنکته: RFC این گزینه ها را به ترتیب معکوس فهرست کرده، بنابراین رقم اول نشان دهنده مقدار C، رقم دوم R،رقم سوم T و رقم چهارم C هست. اینکه چرا به سادگی چهار ورودی برای پیکربندی اضافه نشده برام واقعا جای سواله!، احتمالاً برای سریعتر کردن پیکربندی JIT یا شایدم چیزای دیگه؟!به هر حال، همونطور که گفتم در RFC پیشنهاد شده این عدد برابر 1255 قرار بدیم که یعنی، حداکثر جیتینگ را انجام میده، از JIT ردیابی استفاده می‌کند، از یک تخصیص‌دهنده ثبت اسکن سراسری استفاده میکنه و دستورالعمل AVX را فعال می‌کنه.بنابراین تنظیمات php.ini ما (یا تگ d-) باید این مقادیر را داشته باشه:opcache.enable=1opcache.jit_buffer_size=100Mopcache.jit=1255نکته :به خاطر داشته باشید که opcache.jit یه گزینه اختیاره که اگر کانفیک هم نشهJIT از یک مقدار پیش فرض استفاده میکنه.اگر براتون سوال پیش اومده که مقدار پیشفرض چیه باید بگم :  opcache.jit=tracing!برای شمام سوال شد که این همون بالایی نیست؟! دقیقا خودشه! وقتی دیدن عدد نوشتن کاربر پسند نیست اومدن  دوتا نام مستعار ایجاد کردن که موقع اجرا به اعداد پیشنهادی خودشون تبدیل میشن. یعنی opcache.jit=tracing  و opcache.jit=function.بنابراین اگر دوست دارید همه چیز رو با جزئیاتی که خودتون میخواین تنظیم کنید باید از لیست بالا استفاده کنید ،اما تنها گزینه‌ای که برای فعال کردن JIT با پیکربندی بهینه‌اش نیاز داریم، opcache.jit_buffer_size است :opcache.enable=1opcache.jit_buffer_size=100Mopcache.jit=tracing</description>
                <category>behnam hoseyni</category>
                <author>behnam hoseyni</author>
                <pubDate>Tue, 14 Jun 2022 15:52:16 +0430</pubDate>
            </item>
                    <item>
                <title>ایجاد سرورهای تستی برای کار با Ansible  به کمک Docker</title>
                <link>https://virgool.io/@behnamtakta71/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%B3%D8%B1%D9%88%D8%B1%D9%87%D8%A7%DB%8C-%D8%AA%D8%B3%D8%AA%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-ansible-%D8%A8%D9%87-%DA%A9%D9%85%DA%A9-docker-uqne9wyuf3vw</link>
                <description>ایجاد سرورهای تستی برای کار با Ansible  به کمک Dockerزمانی که شروع به یادگیری انسیبل میکنیم نیاز به محیطی داریم که بتونیم کد هامون رو درش اجرا کنیم و انواع تست ها رو تو حالت های مختلف پیاده سازی کنیم.برای همین من اومدم با کمک داکر محیطی رو ایجاد کردم که بشه به راحتی اینکار رو درونش انجام داد .ما  برای شروع باید  یک Docker Image بسازیم تا بتونیم container هایی رو ازش ایجاد کنیم که نقش سرور تستی رو برای ما بازی کنن.برای اینکار اول باید یک DockerFile   بسازیم و تکه کد زیر رو در این فایل قرار بدیم: FROM ubuntu:latest
RUN apt update &amp;&amp; apt install openssh-server sudo -y
RUN service ssh start
RUN apt install sudo &amp;&amp; apt install nano
RUN useradd -m ansadmin -s /bin/bash
RUN echo &#039;ansadmin:12345678&#039; | chpasswd
RUN chown -R ansadmin /home/ansadmin
RUN echo &#039;ansadmin  ALL=(ALL)  NOPASSWD: ALL&#039; &gt;&gt; /etc/sudoers
RUN apt install software-properties-common -y
RUN add-apt-repository --yes --update ppa:ansible/ansible
RUN apt install ansible -y
EXPOSE 22
CMD [&amp;quot/usr/sbin/sshd&amp;quot,&amp;quot-D&amp;quot]توضیح DockerFile   خط به خط:1: برای ایجاد ایمیج یک سرور لینوکسی نیاز به Ubuntu image  داریم که ما اینجا از آخرین نسخه  یعنی ubuntu:latest  استفاده میکنیم.2,3: در ansible  به دو نوع سرور نیاز داریم.سروری که نقش کنترل کننده بقیه سرور ها رو داره که بهش master میگیم  و سرورهایی که توسط master  کنترل میشن و بهشون Node یا  Slave میگیم.برای اینکه بتونیم از سرور  master به node  ها وصل بشیم باید از ssh  استفاده کنیم. با دستور apt install  openssh-server sudo –y پکیج openssh  رو نصب و بعد با دستور service ssh start اون رو فعال میکنیم.4 : بصورت پیشفرض  image  Ubuntu  پکیج های مورد نیاز ما که nano و sudo هستن رو نداره و ما در این مرحله اونا رو جداگونه نصب میکنیم.5,6,7 : حالا نیاز داریم یوزری رو با دسترسی sudo  داشته باشیم که ansible  با اون یوزر متصل بشه و کاراش رو انجام بده برای اینکار یوزر رو ایجاد و در خط بعد  برای اون رمز عبور  12345678 رو ست میکنیم و در اخر در خط بعدی دسترسی Sudo رو به این یوزر میدیم.8,9,10 : بعد انجام این مراحل میرسیم به مرحله نصب ansible  که در 3 خط  بعدی پیش نیازهای این پکیج  و  خود پکیچ  ansible  رو نصب میکنیم .11: و در مرحله بعد برای اینکه بتونیم به سرور ssh بزنیم  port 22   را توسط داکر Expose  میکنیم.10: در آخر برای دسترسی به ssh  cmd رو برابر [&quot;/usr/sbin/sshd&quot;,&quot;-D&quot;] قرار میدیم. با اینکار رو ssh daemon استارت میکنیم.نکته : daemon SSH ،sshd،  دسترسی ایمن و رمزگذاری شده به سرورهای لینوکس را فراهم می کند.خب حالا میرسیم به مرحله ایجاد image و استفاده از اون.برای اینکار اگر روی ویندوز بودیم این دستور :docker build  --no-cache -t ansible-server .و اکر روی لینوکس  بودیم دستور زیر رو اجرا میکنیم:docker build  --no-cache -t ansible-server ایجاد کانتینرهای تستی :در انسیبل میتونیم node هامون رو به گروه های مختلف جهت اجرای دستورات تقسیم کنیم و برای اینکه بتونیم واقعا این فضا رو داشته باشیم میتونیم container های مختلف با اسم های مختلف ایجاد کنیم.من اینجا دو نوع سرور در نظر گرفتم که یکی DB-server و اونیکی web-server  هست  و از هرکدوم دو مورد ایجاد کردم.docker create --name DB-server1 ansible-server
docker create --name DB-server2 ansible-server
docker create --name web-server1 ansible-server
docker create --name web-server2 ansible-server
.
.با اجرای دستور بالا اگر بصورت صحیح انجام بشه نتیجه بشکل زیر خواهد بود :گرفتن ip از node ها:برای اتصال به node  های ایجاد شده نیاز داریم به  ip  اونها دسترسی داشته باشیم.برای اینکار از دستور زیر استفاده میکنیم:docker inspect -f &#039;{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}&#039;container_nameنکته: ip ها معمولا به ترتیب ایجاد container از 172.17.0.2 شروع میشه.نتیجه اجرای این دستور:ایجاد و اجرای master:همونطور که گفته شد ما برای اینکه یک کنترل کننده متمرکز داشته باشیم باید یک سرور master ایجاد کنیم و به همین جهت یک container جدید با نام master  میسازیم:docker run -d --name master ansible-serverدسترسی به کامند master:برای اجرای دستورات در سطح master باید وارد container master بشیم.برای اینکار دستور زیر رو اجرا میکنیم:docker exec -it master /bin/bashاگر کد به صورت درست اجرا شده باشه خروجی به این  شکل خواهد بود:بجای DB-server1 از master استفاده کنیدبعد از ورود به سطح master اولین کاری که میکنیم باید دستور su – ansadmin رو اجرا کنیم تا یوزرمون به ansadmin تغییر پیدا کنه.در قدم بعدی باید دستور ssh-keygen رو جهت ایجاد ssh-key  اجرا کنیم.(برای تمام سوالات تو این قسمت yes بزنید.)بعد از این مراحل به مرحله اتصال و دسترسی به سرورهای node  میرسیم .کد زیر رو اجرا کنید:ssh-copy-id   container_ipنتیجه اجرای دستور:همونطور که در تصویر مشخص هست ، دوبار سوال میپرسه که هردو را باید yes  بزنیم.مرحله بعد از ما رمز عبور مربوط به یوزر ansadmin رو میپرسه که 12345678 را وارد میکنیم.(داخل داکر فایل نوشتیم).نکته:با انجام این کارها ssh-copy-id ، کلید ایجاد شده رو  بعنوان یک کلید مجازی روی  سرور مقصد نصب می کنه. هدف از اتصال توسط ssh به سرور مقصد  فراهم کردن دسترسی بدون نیاز به رمز عبور برای هر بار ورود هست . این امر ورود خودکار و بدون رمز عبور و ورود به سیستم را با استفاده از پروتکل SSH تسهیل می کنه.بعد از اتمام این کارها sudo nano /etc/ansible/hosts رو میزنیم و وارد فایل host میشیم و به شکل زیر تغییرش میدیم.[web-servers]
#web-server1
172.17.0.5
#web-server2
172.17.0.6
[db-servers]
#db-server1
172.17.0.2
#db-server2
172.17.0.4حالا سرورهامون به دو دسته db-server و web-server تقسیم شدن و میتونیم هر تعداد سرور و گروه که میخوایم ایجاد و استفاده کنیم.برای اینکه تست کنیم و مطمئن بشیم انسیبل درست عمل میکنه دستور زیر رو اجرا میکنیم.ansible all -m pingوباید خروجی به این شکل داشته باشیم:امیدوارم این آموزش به کارتون بیاد و بتونید برای یادگیری انسیبل استفاده کنید.</description>
                <category>behnam hoseyni</category>
                <author>behnam hoseyni</author>
                <pubDate>Sat, 15 Jan 2022 17:41:59 +0330</pubDate>
            </item>
            </channel>
</rss>