ভিত্তিহীন সাফল্য php. PHP এবং AJAX ব্যবহার করার একটি সহজ উদাহরণ। কিভাবে এটা সব শুরু

ভিসা: ব্লাউ কার্তে ইইউ

নথি জমা দেওয়ার সময় বয়স 29 বছর

আস্ট্রখান থেকে

দূতাবাস শহর: মস্কো

বিশ্ববিদ্যালয়, বিশেষত্ব: আস্ট্রখান স্টেট টেকনিক্যাল ইউনিভার্সিটি, ইন্টিগ্রেটেড সাপোর্ট তথ্য নিরাপত্তাস্বয়ংক্রিয় সিস্টেম

ভাষা: ইংরেজি ইন্টারমিডিয়েট

কিভাবে এটি সব শুরু:

অনেকদিন ধরেই কোথাও যাওয়ার ইচ্ছা ছিল। সত্য, প্রধানত সমুদ্রের সাথে উষ্ণ দেশগুলি বিবেচনা করা হয়েছিল। দুবার আমরা মন্টিনিগ্রো বা বুলগেরিয়া যাওয়ার বিষয়ে জলের গুরুত্বের সাথে তদন্ত করেছি। ফলে শেষ মুহূর্তে কোনো না কোনো কারণে তাদের মত পরিবর্তন হয়। শেষবার 2014 সালের সেপ্টেম্বরে গাড়ি বিক্রির জন্য গুরুতর প্রস্তুতি নেওয়া হয়েছিল।

অক্টোবরে, আমি ঘটনাক্রমে জার্মানিতে স্থানান্তরিত করার জন্য প্রোগ্রামারদের জন্য একটি বিজ্ঞাপন দেখলাম। সেই সময়ে, আমার ব্লু কার্ডের অস্তিত্ব সম্পর্কে কোনো ধারণা ছিল না এবং জার্মানিকে ইউরোপীয় ইউনিয়নের বাইরের নাগরিকদের প্রতি অবিশ্বাস্যভাবে কঠোর অভিবাসন নীতি সহ একটি দেশ বলে মনে করতাম।

একটি নির্দিষ্ট পরিমাণ সংশয় এবং অবিশ্বাস নিয়ে, আমি স্কাইপে লিখেছিলাম। স্ক্রিনের অন্য দিকে, একজন মহিলা নিয়োগকারী (আলিনা) উত্তর দিয়েছেন, যিনি পরবর্তীতে জার্মানিতে স্থানান্তরিত হওয়ার সাথে আইটি কর্মীদের নির্বাচনের সাথে জড়িত। আমাদের প্রথম কথোপকথনের সময়, আমরা বার্লিনে সদর দফতর সহ একটি বড় অনলাইন স্টোরের জন্য প্রোগ্রামারদের নিয়োগ করছিলাম। আমি আমার জীবনবৃত্তান্ত পাঠিয়ে অপেক্ষা করছিলাম।

কিছু সময় পর, আলিনা বলল যে জার্মানি থেকে তার সহকর্মী আমার সাথে কথা বলবেন ভাষার মাত্রা এবং পর্যাপ্ততা মূল্যায়ন করতে। সাক্ষাত্কারটি দুটি যৌক্তিক সমস্যার সাথে কথোপকথনের মতো ছিল, এটি স্কাইপে প্রায় 30 মিনিট স্থায়ী হয়েছিল। এরপর আমাকে অপেক্ষা করতে বলা হয়। প্রায় এক সপ্তাহ পরে প্রথম প্রযুক্তিগত সাক্ষাৎকার নির্ধারিত ছিল। প্রযুক্তিগত সাক্ষাৎকারটি কোম্পানির একজন ডেভেলপারের সাথে স্কাইপের মাধ্যমেও হয়েছিল। আমার মতে, এটি বেশ সফল ছিল, কিন্তু এক সপ্তাহ পরে আমাকে বলা হয়েছিল যে আমি উপযুক্ত নই। যাইহোক, আলিনার একক প্রার্থী নির্দিষ্ট কারণে পাস করেননি।

কিভাবে এটি সব পরিণত হয়েছে:

আমি একটু বিরক্ত ছিলাম, কিন্তু জীবন যায়। এবং কয়েকদিন পরে আলিনা বলল যে তাদের স্টুটগার্ট থেকে একজন নতুন ক্লায়েন্ট এসেছে যিনি ডেভেলপারদের খুঁজছিলেন, এবং আমার একটি সাক্ষাত্কার নির্ধারিত ছিল। ইন্টারভিউয়ের প্রথম অংশটি আইটি এবং এইচআর বিভাগের প্রধানের সাথে শেয়ার করা হয়েছে। অভিজ্ঞতা সম্পর্কে সাধারণ কথোপকথন, নিজের এবং কোম্পানি, উভয় পক্ষের প্রচুর হাসি এবং কৌতুক। স্পষ্টতই, তারা আমার হাস্যরস পছন্দ করেছিল, তাই কয়েক দিন পরে আমি একজন সম্ভাব্য তাত্ক্ষণিক সুপারভাইজারের সাথে একটি প্রযুক্তিগত সাক্ষাত্কারের জন্য নির্ধারিত হয়েছিল। সাক্ষাত্কারের এই অংশটি আমাকে কিছুটা বিস্মিত করেছে, কারণ একজন প্রার্থী পরে এটিকে বলেছিল, এটি ছিল "এক গ্লাস বিয়ারের উপর দুই প্রোগ্রামারের মধ্যে কথোপকথন"। সেদিন সন্ধ্যায় অফিসে ব্যক্তিগত সাক্ষাৎকারের আমন্ত্রণ পেলাম।

তখন আমার খোলা সেনজেন ভিসা ছিল না। জরুরী ভিত্তিতে প্রয়োজনীয় কাগজপত্র সংগ্রহ করা হয়েছে। মস্কোর জার্মান ভিসা কেন্দ্রে, আমি একটি জরুরি ভিসার জন্য আবেদন করেছিলাম এবং পরের দিনই আমি ভিসার সাথে আমার পাসপোর্ট তুলে নিলাম। Esslingen থেকে আমাকে পাঠানো একটি আমন্ত্রণের ভিত্তিতে আমি একটি ব্যবসায়িক ভিসার জন্য আবেদন করেছি - এটি শুধুমাত্র একটি চিঠি যেখানে আমাকে যোগাযোগের জন্য আমন্ত্রণ জানানো হয়েছে এবং এতে স্পষ্টভাবে বলা হয়েছে যে কোম্পানি ফ্লাইট, স্থানান্তর, খাবার এবং বাসস্থান সংক্রান্ত সমস্ত আর্থিক সমস্যাগুলির যত্ন নেয়। .

অফিসে ব্যক্তিগত যোগাযোগ হয় কোম্পানির তিনজন প্রধান আইটি ব্যবস্থাপকের সঙ্গে। প্রথম অংশ আবার অভিজ্ঞতা, দক্ষতা এবং কিছু বিষয়ের সাধারণ বোঝাপড়া সম্পর্কে যোগাযোগ। দ্বিতীয়টি কম্পিউটারে। সত্যি কথা বলতে, এগুলি "পরীক্ষার অভিজ্ঞতা সহ জুনিয়র স্তরে" খুব, খুব সহজ কাজ :)। কাজগুলো করা হলো। এর পরে, মধ্যাহ্নভোজন এবং অবিলম্বে কোম্পানি দ্বারা স্বাক্ষরিত কাজের চুক্তির দুটি কপি (অবস্থান সিনিয়র পিএইচপি বিকাশকারী) আকারে একটি অফার। আমি চিন্তা করার জন্য সময় নিয়েছিলাম এবং বলেছিলাম যে আমি এক সপ্তাহের মধ্যে প্রতিক্রিয়া জানাব।

সিদ্ধান্ত নেওয়া হল এবং আমি ভিসার জন্য আবেদন করার জন্য প্রস্তুত হতে লাগলাম।

আমরা কিভাবে সরানো হয়েছে:

কোম্পানি আমার এবং আমার পরিবারের (স্ত্রী এবং 2.5 বছর বয়সী মেয়ে) জন্য ফ্লাইটের জন্য অর্থ প্রদান করেছে, প্রথম তিন মাসের জন্য আমাদের একটি অ্যাপার্টমেন্ট ভাড়া দিয়েছে (আমার ক্ষেত্রে, মার্কটপ্ল্যাটজ শহরের কেন্দ্রীয় স্কোয়ারকে উপেক্ষা করে একটি আদর্শ জায়গা) এবং বরাদ্দ করা হয়েছে প্রথমবারের মতো সাহায্য করার জন্য একজন ব্যক্তি। এটি তার বিশুদ্ধতম আকারে একটি স্থানান্তর এজেন্ট নয়, তবে আমরা তার মাধ্যমে উত্থাপিত সমস্ত সমস্যা সমাধান করেছি৷ আমি কোম্পানির প্রথম নন-ইইউ কর্মী ছিলাম, তাই অনেক প্রশ্ন আমার দিকে নিবদ্ধ ছিল। এখন, আমার পাশাপাশি, কিইভের আর একজন লোক কোম্পানিতে কাজ করে (সে আমার এক মাস পরে এসেছিল) এবং ওডেসার একজন বিকাশকারী সরানোর জন্য প্রস্তুত হচ্ছে। এরা সকলেই আলিনার সহায়তায় চাকুরী করা হয়েছিল।

এখানে আমি বলতে চাই যে আমি আলিনার কাছে অত্যন্ত কৃতজ্ঞ, যিনি কর্মসংস্থান প্রক্রিয়া চলাকালীন আমার সমস্ত সমস্যা সমাধান করেছেন। আমি খুব ভাগ্যবান ছিলাম যে কর্মসংস্থানের সমস্ত পর্যায়ে এবং পরবর্তী অভিযোজনে একজন ব্যক্তি ছিলেন যিনি প্রয়োজনীয় সমস্যাটি সাহায্য করতে এবং সমাধান করতে প্রস্তুত ছিলেন।

প্রথমে আমি একা এসেছি, এবং দুই সপ্তাহ পরে আমার পরিবারও এসেছিল। আগমনের পর কেউ আপনাকে শুভেচ্ছা জানাবে না; ওরা আমাকে হোটেল থেকে তুলে ওই জায়গায় নিয়ে আসে :)

তারা জিনিস থেকে প্রয়োজনীয় ন্যূনতম গ্রহণ.

ABH এর সাথে সবকিছু খুব দ্রুত চলে গেল। এই ধরনের সমস্ত সমস্যা একটি কোম্পানির কর্মচারীর সাথে যৌথভাবে সমাধান করা হয়েছিল। ABH আগমনের পরে বেশ তাড়াতাড়ি মেয়াদ নিযুক্ত করেছিল, আমরা নথি জমা দিয়েছিলাম এবং তিন সপ্তাহ পরে আমাদের eAT কার্ডগুলি পেয়েছি।

আমরা যেভাবে বসতি স্থাপন করেছি:

চালু এই মুহূর্তেআমরা এসলিংজেনে বাস করি - একটি অবিশ্বাস্যভাবে সুন্দর এবং পরিষ্কার শহর, স্টুটগার্ট থেকে মাত্র 15 মিনিটের দূরত্বে অবস্থিত। ভাষা না জানার কারণে আমরা এখনও কোনো অস্বস্তি অনুভব করি না, বেশিরভাগ ক্ষেত্রে আমরা ইংরাজীতে বা চরম ক্ষেত্রে, অঙ্গভঙ্গির মাধ্যমে যোগাযোগ করতে পারি। এই মুহূর্তে বিদ্যমান একমাত্র সমস্যা হল একটি অ্যাপার্টমেন্ট ভাড়া করা। খুব কম অফার আছে, এবং চাহিদা অবিশ্বাস্যভাবে বেশি। স্টুটগার্টে আবাসন পরিস্থিতি একটু সহজ, কিন্তু আমি Esslingen-এ থাকতে চাই।

আনুমানিক তারিখ সহ সংক্ষিপ্ত সারসংক্ষেপ:

2014 সালের অক্টোবরের মাঝামাঝি - প্রোগ্রামারদের জন্য একটি বিজ্ঞাপন দেখেছি

অক্টোবরের শেষ - নভেম্বরের মাঝামাঝি - প্রথম কোম্পানির সাথে সাক্ষাৎকার

নভেম্বরের মাঝামাঝি - নভেম্বরের শেষ - আমার বর্তমান কোম্পানির সাথে সাক্ষাত্কার, একটি ব্যক্তিগত সাক্ষাত্কারের জন্য একটি অফার পাওয়া

জানুয়ারী 20 - ফেব্রুয়ারি 1, 2015 - একটি জাতীয় ভিসার জন্য আবেদন করা, ভিসা সহ পাসপোর্ট গ্রহণ করা

) ক্লাউড একটি সময়সূচী বা একটি API এর মাধ্যমে বিভিন্ন PHP স্ক্রিপ্ট চালানোর জন্য ডিজাইন করা হয়েছে। একটি নিয়ম হিসাবে, এই স্ক্রিপ্টগুলি সারিগুলি প্রক্রিয়া করে এবং লোডটি প্রায় 100টি সার্ভারের উপর "প্রসারিত" হয়৷ পূর্বে, আমরা কীভাবে নিয়ন্ত্রণ লজিক প্রয়োগ করা হয় তার উপর ফোকাস করেছি, যা এই ধরনের সংখ্যক সার্ভার জুড়ে সমানভাবে লোড বিতরণ এবং একটি সময়সূচী অনুযায়ী কাজ তৈরি করার জন্য দায়ী। কিন্তু, এটি ছাড়াও, আমাদের একটি ডেমন লিখতে হবে যা আমাদের পিএইচপি স্ক্রিপ্টগুলিকে CLI-তে চালাতে এবং তাদের সম্পাদনের অবস্থা নিরীক্ষণ করতে সক্ষম হবে।

তিনি মূলত সি-তে লেখা হয়েছিল, আমাদের কোম্পানির অন্যান্য রাক্ষসের মতো। যাইহোক, আমরা এই সত্যটির মুখোমুখি হয়েছিলাম যে প্রসেসরের সময়ের একটি উল্লেখযোগ্য অংশ (প্রায় 10%) মূলত নষ্ট হয়েছিল: দোভাষী চালু করা এবং আমাদের কাঠামোর "কোর" লোড করা। অতএব, শুধুমাত্র একবার দোভাষী এবং আমাদের কাঠামো শুরু করতে সক্ষম হওয়ার জন্য, পিএইচপি-তে ডেমন পুনরায় লেখার সিদ্ধান্ত নেওয়া হয়েছিল। আমরা এটিকে পিএইচপি বলেছি শিলা syd (Phproxyd-এর অনুরূপ - PHP প্রক্সি ডেমন, একটি সি ডেমন যা আমাদের আগে ছিল)। এটি পৃথক ক্লাস চালানোর অনুরোধ গ্রহণ করে এবং প্রতিটি অনুরোধে একটি ফর্ক() তৈরি করে এবং প্রতিটি রানের নির্বাহের অবস্থা রিপোর্ট করতে সক্ষম হয়। এই আর্কিটেকচারটি অনেক উপায়ে অ্যাপাচি ওয়েব সার্ভার মডেলের অনুরূপ, যখন সমস্ত প্রাথমিককরণ একবার "মাস্টার" এ সম্পন্ন হয় এবং "শিশুরা" অনুরোধটি প্রক্রিয়াকরণে নিযুক্ত থাকে। একটি অতিরিক্ত বোনাস হিসাবে, আমরা CLI-তে অপকোড ক্যাশে সক্ষম করার ক্ষমতা পাই, যা সঠিকভাবে কাজ করবে কারণ সমস্ত শিশু মাস্টার প্রক্রিয়ার মতো একই ভাগ করা মেমরি অঞ্চলের উত্তরাধিকারী হয়। একটি লঞ্চ অনুরোধ প্রক্রিয়া করার সময় বিলম্ব কমাতে, আপনি fork() অগ্রিম (প্রিফর্ক মডেল) করতে পারেন, কিন্তু আমাদের ক্ষেত্রে fork() এর বিলম্ব প্রায় 1 ms, যা আমাদের জন্য বেশ উপযুক্ত।

যাইহোক, যেহেতু আমরা কোডটি প্রায়শই আপডেট করি, তাই এই ডেমনটিকেও ঘন ঘন পুনরায় চালু করতে হবে, অন্যথায় এটিতে লোড করা কোডটি পুরানো হয়ে যেতে পারে। যেহেতু প্রতিটি রিস্টার্টের সাথে অনেক ত্রুটি থাকবে পিয়ার দ্বারা সংযোগ রিসেট, শেষ ব্যবহারকারীদের পরিষেবা অস্বীকার সহ (ডেমনটি কেবল ক্লাউডের জন্যই নয়, আমাদের সাইটের অংশের জন্যও দরকারী), আমরা ইতিমধ্যে প্রতিষ্ঠিত সংযোগগুলি না হারিয়ে ডেমন পুনরায় চালু করার উপায়গুলি সন্ধান করার সিদ্ধান্ত নিয়েছি। একটি জনপ্রিয় কৌশল আছে যা করতে ব্যবহৃত হয় করুণাময় পুনরায় লোডডেমনের জন্য: ফর্ক-এক্সেক করা হয় এবং লিসেন সকেট থেকে একটি বর্ণনাকারী শিশুর কাছে পাঠানো হয়। এইভাবে, নতুন সংযোগ ইতিমধ্যে গৃহীত হয় নতুন সংস্করণরাক্ষস, এবং পুরানোগুলি পুরানো সংস্করণ ব্যবহার করে "পরিবর্তিত" হয়।

এই নিবন্ধে আমরা আরও জটিল বিকল্পটি দেখব। করুণাময় পুনরায় লোড: পুরানো সংযোগগুলি ডেমনের নতুন সংস্করণ দ্বারা প্রক্রিয়া করা অব্যাহত থাকবে, যা আমাদের ক্ষেত্রে গুরুত্বপূর্ণ, কারণ অন্যথায় এটি পুরানো কোড চালাবে।

তত্ত্ব আসুন প্রথমে চিন্তা করি: আমরা যা পেতে চাই তা কি সম্ভব? এবং যদি তাই হয়, কিভাবে এই অর্জন?

যেহেতু ডেমন লিনাক্সে চলে, যা POSIX-সঙ্গী, নিম্নলিখিত বিকল্পগুলি আমাদের কাছে উপলব্ধ:

  • সমস্ত খোলা ফাইল এবং সকেটগুলি খোলা বর্ণনাকারী নম্বরের সাথে সম্পর্কিত সংখ্যা। স্ট্যান্ডার্ড ইনপুট, আউটপুট এবং ত্রুটি স্ট্রীমের যথাক্রমে 0, 1 এবং 2 বর্ণনাকারী রয়েছে।
  • মধ্যে কোন উল্লেখযোগ্য পার্থক্য নেই ফাইল খুলুন, সকেট এবং পাইপ (পাইপ) নয় (উদাহরণস্বরূপ, আপনি সিস্টেম কলগুলি পড়তে/লিখতে এবং sendto/recv থেকে উভয় ব্যবহার করে সকেটের সাথে কাজ করতে পারেন)।
  • নির্বাহ করার সময় সিস্টেম কল fork() সমস্ত খোলা বর্ণনাকারী উত্তরাধিকারসূত্রে প্রাপ্ত হয়, তাদের সংখ্যা সংরক্ষণ করে এবং পজিশন (ফাইলে) রিড/রাইট করে।
  • যখন execve() সিস্টেম কলটি কার্যকর করা হয়, তখন সমস্ত খোলা হ্যান্ডেলগুলিও উত্তরাধিকারসূত্রে প্রাপ্ত হয়, এবং উপরন্তু প্রক্রিয়াটির পিআইডি বজায় থাকে এবং তাই এর বাচ্চাদের সাথে একটি সম্পর্ক থাকে।
  • ওপেন প্রসেস ডিসক্রিপ্টারের তালিকা /dev/fd ডিরেক্টরি থেকে পাওয়া যায়, যা লিনাক্সে /proc/self/fd-এর সিমলিংক।
  • এইভাবে, আমাদের বিশ্বাস করার প্রতিটি কারণ রয়েছে যে আমাদের কাজটি সম্পন্ন করা যেতে পারে, এবং অনেক প্রচেষ্টা ছাড়াই। সুতরাং, চলুন শুরু করা যাক PHP প্যাচগুলি দুর্ভাগ্যবশত, একটি ছোট বিবরণ রয়েছে যা আমাদের কাজকে জটিল করে তোলে: পিএইচপি-তে স্ট্রিমগুলির জন্য ফাইল বর্ণনাকারী নম্বর পাওয়ার এবং নম্বর অনুসারে ফাইল বর্ণনাকারী খোলার কোন উপায় নেই (পরিবর্তে, ফাইল বর্ণনাকারীর একটি অনুলিপি। খোলা হয়েছে, যা আমাদের ডেমনের জন্য উপযুক্ত নয়, যেহেতু আমরা খুব সাবধানে খোলা হ্যান্ডেলগুলি পর্যবেক্ষণ করি যাতে পুনরায় আরম্ভ করার সময় এবং শিশু প্রক্রিয়া শুরু করার সময় লিক না হয়)।

    প্রথমত, আমরা একটি স্ট্রীম থেকে fd পাওয়ার ক্ষমতা যোগ করতে পিএইচপি কোডে কয়েকটি ছোট প্যাচ তৈরি করব এবং নিশ্চিত করব যে fopen(php://fd/) হ্যান্ডেলের একটি অনুলিপি খুলবে না (দ্বিতীয় পরিবর্তন বর্তমান PHP আচরণের সাথে বেমানান, তাই আপনি পরিবর্তে একটি নতুন "ঠিকানা" যোগ করতে পারেন, উদাহরণস্বরূপ, php://fdraw/):

    প্যাচ কোড

    diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c সূচী f8d7bda..fee964c 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/pen_wrapper.c +++ b/ext/standard. c @@ -24.6 +24.7 @@ #if HAVE_UNISTD_H #include #endif +#include #include "php.h" #include "php_globals.h" @@ -296.11 +297.11 @@ php_stream * php_stream_url, char_wrap_url *পথ, ch "ফাইল বর্ণনাকারী অবশ্যই %d এর থেকে ছোট অ-নেতিবাচক সংখ্যা হতে হবে", dtablesize);


    আমরা stream_get_meta_data() দ্বারা প্রত্যাবর্তিত ফলাফলে fd ক্ষেত্র যোগ করেছি যদি এটি অর্থপূর্ণ হয় (উদাহরণস্বরূপ, zlib স্ট্রিমগুলির জন্য fd ক্ষেত্রটি উপস্থিত থাকবে না)। আমরা পাস করা ফাইল ডিস্ক্রিপ্টর থেকে এটির একটি সাধারণ চেক দিয়ে dup() কলটি প্রতিস্থাপন করেছি। দুর্ভাগ্যবশত, এই কোডটি উইন্ডোজে পরিবর্তন ছাড়া কাজ করবে না, যেহেতু fcntl() কলটি POSIX-নির্দিষ্ট, তাই পূর্ণ প্যাচটিতে অন্য OS-এর জন্য অতিরিক্ত কোড শাখা থাকতে হবে, প্রথমে একটি ছোট সার্ভার লিখুন যে অনুরোধ গ্রহণ করতে সক্ষম হবে JSON বিন্যাসএবং কিছু উত্তর দিন। উদাহরণস্বরূপ, এটি অনুরোধে আসা অ্যারের উপাদানগুলির সংখ্যা ফেরত দেবে।

    ডেমন 31337 পোর্টে শোনে। ফলাফলটি এরকম কিছু হওয়া উচিত:

    $ telnet localhost 31337 চেষ্টা করছে 127.0.0.1... লোকালহোস্টের সাথে সংযুক্ত। Escape অক্ষর হল "^]"। ("হ্যাশ":1) # ব্যবহারকারীর ইনপুট "অনুরোধে 1টি কী ছিল" ("হ্যাশ":1,"cnt":2) # ব্যবহারকারীর ইনপুট "অনুরোধে 2টি কী ছিল"

    আমরা একটি পোর্টে শোনা শুরু করতে stream_socket_server() ব্যবহার করব এবং কোন হ্যান্ডেলগুলি পড়তে/লিখতে প্রস্তুত তা নির্ধারণ করতে stream_select() ব্যবহার করব।

    সবচেয়ে সহজ বাস্তবায়ন কোড (Simple.php)

    নির্দেশনা