file_get_contents ভুল ফলাফল পাচ্ছে


10

হালনাগাদ

আমি সমস্যাটি সমাধান করেছি এবং একটি উত্তর পোস্ট করেছি। তবে, আমার সমাধানটি 100% আদর্শ নয়। আমি বরং কেবল symlinkএর cacheসাথে clearstatcache(true, $target)বা এটি থেকে সরিয়ে ফেলব clearstatcache(true, $link)যা কার্যকর হয় না।

আমি প্রথমে সিমলিংকগুলির ক্যাচিং প্রতিরোধ করতে বা सि্যামলিংকটি তৈরির সাথে সাথেই ক্যাশে থেকে সরিয়ে ফেলতে চাই। দুর্ভাগ্যক্রমে, আমার সাথে ভাগ্য ছিল না। কোনও কারণে clearstatcache(true)সিমলিংক তৈরির পরে কাজ হয় না, এটি এখনও ক্যাশে হয়ে যায়।

আমি আনন্দের সাথে যে কাউকে আমার উত্তরটি উন্নত করতে এবং এই সমস্যাগুলি সমাধান করতে পারে তাকে অনুদান প্রদান করব ।

সম্পাদন করা

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


আমি PHP 7.3.5সাথে ব্যবহার করছি nginx/1.16.0। কখনও কখনও file_get_contentsএকটি ব্যবহার করার সময় ভুল মান প্রদান করে symlink। সমস্যাটি একটি সিমিলিংক মোছার এবং পুনরায় তৈরি করার পরে, এর পুরানো মানটি ক্যাশে রয়েছে। কখনও কখনও সঠিক মান ফিরে আসে, কখনও কখনও পুরানো মান। এটি এলোমেলো প্রদর্শিত হয়।

আমি ক্যাশে সাফ করার চেষ্টা করেছি বা এর সাহায্যে ক্যাশে প্রতিরোধ করেছি:

function symlink1($target, $link)
{
    realpath_cache_size(0);
    symlink($target, $link);
    //clearstatcache(true);
}

আমি সত্যিই ক্যাচিং অক্ষম করতে চাই না তবে আমার এখনও ফাইল_জেট_কন্টেন্টের সাথে 100% নির্ভুলতা প্রয়োজন need

সম্পাদন করা

আমি আমার উত্স কোডটি পোস্ট করতে পারছি না, কারণ এটি অনেক দীর্ঘ এবং জটিল, তাই আমি একটি ন্যূনতম, পুনরুত্পাদনযোগ্য উদাহরণ তৈরি করেছি (index.php) যা সমস্যাটি পুনরায় তৈরি করে:

<h1>Symlink Problem</h1>
<?php
    $dir = getcwd();
    if (isset($_POST['clear-all']))
    {
        $nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
        foreach ($nos as $no)
        {
            unlink($dir.'/nos/'.$no.'/id.txt');
            rmdir($dir.'/nos/'.$no);
        }
        foreach (array_values(array_diff(scandir($dir.'/ids'), array('..', '.'))) as $id)
            unlink($dir.'/ids/'.$id);
    }
    if (!is_dir($dir.'/nos'))
        mkdir($dir.'/nos');
    if (!is_dir($dir.'/ids'))
        mkdir($dir.'/ids');
    if (isset($_POST['submit']) && !empty($_POST['id']) && ctype_digit($_POST['insert-after']) && ctype_alnum($_POST['id']))
    {
        $nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
        $total = count($nos);
        if ($total <= 100)
        {
            for ($i = $total; $i >= $_POST['insert-after']; $i--)
            {
                $id = file_get_contents($dir.'/nos/'.$i.'/id.txt');
                unlink($dir.'/ids/'.$id);
                symlink($dir.'/nos/'.($i + 1), $dir.'/ids/'.$id);
                rename($dir.'/nos/'.$i, $dir.'/nos/'.($i + 1));
            }
            echo '<br>';
            mkdir($dir.'/nos/'.$_POST['insert-after']);
            file_put_contents($dir.'/nos/'.$_POST['insert-after'].'/id.txt', $_POST['id']);
            symlink($dir.'/nos/'.$_POST['insert-after'], $dir.'/ids/'.$_POST['id']);
        }
    }
    $nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
    $total = count($nos) + 1;
    echo '<h2>Ids from nos directory</h2>';
    foreach ($nos as $no)
    {
        echo ($no + 1).':'.file_get_contents("$dir/nos/$no/id.txt").'<br>';
    }
    echo '<h2>Ids from using symlinks</h2>';
    $ids = array_values(array_diff(scandir($dir.'/ids'), array('..', '.')));
    if (count($ids) > 0)
    {
        $success = true;
        foreach ($ids as $id)
        {
            $id1 = file_get_contents("$dir/ids/$id/id.txt");
            echo $id.':'.$id1.'<br>';
            if ($id !== $id1)
                $success = false;
        }
        if ($success)
            echo '<b><font color="blue">Success!</font></b><br>';
        else
            echo '<b><font color="red">Failure!</font></b><br>';
    }
?>
<br>
<h2>Insert ID after</h2>
<form method="post" action="/">
    <select name="insert-after">
        <?php
            for ($i = 0; $i < $total; $i++)
                echo '<option value="'.$i.'">'.$i.'</option>';
        ?>
    </select>
    <input type="text" placeholder="ID" name="id"><br>
    <input type="submit" name="submit" value="Insert"><br>
</form>
<h2>Clear all</h2>
<form method="post" action="/">
    <input type="submit" name="clear-all" value="Clear All"><br>
</form>
<script>
    if (window.history.replaceState)
    {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

এটি Nginxকনফিগারেশনে সমস্যা বলে মনে হয়েছে । এই লাইন না থাকা সমস্যার কারণ হতে পারে:

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;

এখানে আমার Nginxকনফিগারেশন (আপনি দেখতে পাচ্ছেন যে আমি উপরের লাইনগুলি অন্তর্ভুক্ত করেছি):

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.websemantica.co.uk;
    root "/path/to/site/root";
    index index.php;

    location / {
        try_files $uri $uri/ $uri.php$is_args$query_string;
    }

    location ~* \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_param   QUERY_STRING            $query_string;
        fastcgi_param   REQUEST_METHOD          $request_method;
        fastcgi_param   CONTENT_TYPE            $content_type;
        fastcgi_param   CONTENT_LENGTH          $content_length;

        fastcgi_param   SCRIPT_FILENAME         $realpath_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
        fastcgi_param   PATH_INFO               $fastcgi_path_info;
        fastcgi_param   PATH_TRANSLATED         $realpath_root$fastcgi_path_info;
        fastcgi_param   REQUEST_URI             $request_uri;
        fastcgi_param   DOCUMENT_URI            $document_uri;
        fastcgi_param   DOCUMENT_ROOT           $realpath_root;
        fastcgi_param   SERVER_PROTOCOL         $server_protocol;

        fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
        fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;

        fastcgi_param   REMOTE_ADDR             $remote_addr;
        fastcgi_param   REMOTE_PORT             $remote_port;
        fastcgi_param   SERVER_ADDR             $server_addr;
        fastcgi_param   SERVER_PORT             $server_port;
        fastcgi_param   SERVER_NAME             $server_name;

        fastcgi_param   HTTPS                   $https;

        # PHP only, required if PHP was built with --enable-force-cgi-redirect
        fastcgi_param   REDIRECT_STATUS         200;

        fastcgi_index index.php;
        fastcgi_read_timeout 3000;
    }

    if ($request_uri ~ (?i)^/([^?]*)\.php($|\?)) {
        return 301 /$1$is_args$args;
    }
    rewrite ^/index$ / permanent;
    rewrite ^/(.*)/$ /$1 permanent;
}

বর্তমানে আমার উপরের উদাহরণটি https://www.websemantica.co.uk এ লাইভ রয়েছে ।

ফর্মটিতে কয়েকটি মান যুক্ত করার চেষ্টা করুন। এটি Success!প্রতিবার নীল রঙে প্রদর্শন করা উচিত । কখনও কখনও শো Failure!লাল হয়। এটা বেশ কয়েক পৃষ্ঠা রিফ্রেশ নেওয়া থেকে পরিবর্তন করতে পারেন Success!করতে Failure!বা সহ-বিপরীতভাবে। অবশেষে, এটি Success!প্রতিবার প্রদর্শিত হবে , সুতরাং কিছু ধরণের ক্যাশে সমস্যা থাকতে হবে।


আমি একই কেসটি ঘুরে দেখছিলাম এবং realpathফাংশন পৃষ্ঠায় খুব দরকারী মন্তব্য পেয়েছি । হতে পারে এটি আপনাকে সাহায্য করতে পারে।
মার্ভ 255

@ marv255 আমি ব্যবহার করার চেষ্টা realpathসঙ্গে file_get_conentsএবং কোন সৌভাগ্য কামনা করছি। এটি এখনও মাঝে মাঝে ক্যাশে থেকে লোড হয়।
ড্যান ব্রে

2
আমার অর্থ কেবল না realpath, তবে এমন কিছুclearstatcache(true); file_get_conents(realpath($fileName));
মার্ভ 255

Linux.die.net/man/8/updatedb চেষ্টা করুন পরপর কলগুলির মধ্যে কমান্ডটি চালান। যদিও আমি নিশ্চিত না যে পিএইচপিতে সমস্যাটি কীভাবে সমাধান করা যায় যদি এটি হয় তবে।
জেনেস বোটিস

উত্তর:


3

এটি ওএস স্তরের উপর নির্ভর করে। তাহলে কীভাবে বাক্সটি চিন্তা করার চেষ্টা করবেন। কীভাবে ফাইলটির আসল অবস্থানটি পড়ার চেষ্টা করবেন readlinkএবং সেই আসল অবস্থানের পথটি ব্যবহার করবেন?

$realPath = shell_exec("readlink " . $yourSymlink);
$fileContent = file_get_contents($realPath);

আমি মনে করি না যে এটি যথেষ্ট পরিমাণে (বাক্সের), রিডলিংক ওএস লেভেলের কলগুলির উপরও নির্ভর করে এবং ক্যাশে দ্বারা প্রভাবিত।
বাহরাম আরদালান

3

এটি পিএইচপি-র পছন্দসই আচরণ এটি এখানে আপনি দেখতে পাচ্ছেন কারণ পিএইচপি পারফরম্যান্স বর্ধনেরrealpath_cache কারণে ফাইল পাথ সঞ্চয় করতে ব্যবহার করে যাতে এটি ডিস্ক অপারেশনগুলি হ্রাস করতে পারে।

এই আচরণটি এড়াতে সম্ভবত আপনি ফাংশনটি realpath_cacheব্যবহারের আগে পরিষ্কার করার চেষ্টা করতে পারেনget_file_contents

আপনি এরকম কিছু চেষ্টা করতে পারেন:


clearstatcache();
$data = file_get_contents("Your File");

আপনি পিএইচপি ডকটিতে ক্লিয়ারস্ট্যাচচের জন্য আরও পড়তে পারেন ।


2

দুটি ক্যাশে আছে।

প্রথমে ওএস ক্যাশে এবং তারপরে পিএইচপি ক্যাশে।

বেশিরভাগ ক্ষেত্রে clearstatcache(true)আগে file_get_contents(...)কাজ করে।

তবে কখনও কখনও আপনার ওএস ক্যাশেও সাফ করা দরকার। লিনাক্সের ক্ষেত্রে, আমি দুটি জায়গা সাফ করার জন্য ভাবতে পারি। পেজ ক্যাশে (1) এবং ডেন্ট্রি / ইনোড (2)।

এটি উভয়কে সাফ করে:

shell_exec('echo 3 > /proc/sys/vm/drop_caches')

দ্রষ্টব্য: এটি সমস্যা সমাধানের জন্য ভাল তবে উত্পাদন বারবার কল করার জন্য নয় কারণ এটি পুরো ওএস ক্যাশে সাফ করে এবং ক্যাশে পুনরায় জনসংখ্যার কয়েক মুহুর্তে সিস্টেমটির জন্য ব্যয় করে।


এটি কাজ করে না, এটি এখনও মাঝে মাঝে ক্যাশেড মান লোড করে এবং আমার এমন একটি সমাধান প্রয়োজন যা উত্পাদনে ঘন ঘন কল করার জন্য ভাল।
ড্যান ব্রে

2
@ ড্যানব্রে, আপনি কি কখনও কখনও প্রকৃতি সম্পর্কে আরও জানতে লগ ইন করতে পারেন ?
বাহরাম আরদালান

1
@ ড্যানব্রে, এবং আপনি কীভাবে পুরানো মানটির উপস্থিতি আবিষ্কার করবেন ? এটি কি এমন হতে পারে যে অন্য পরীক্ষার শর্তগুলির কারণে আপনার পরীক্ষার পুরানো মানটি ফেরত পেয়েছে যখন সেখানে মানটি সত্যই পরিবর্তিত হয়েছে?
বাহরাম আরদালান

2

"সমস্যাটি একটি সিমিলিংক মোছার এবং পুনরুদ্ধার করার পরে"

আপনি কীভাবে সিমলিংকটি মুছবেন? কোনও ফাইল (বা একটি সিমলিংক) মুছে ফেলা হলে স্বয়ংক্রিয়ভাবে ক্যাশে সাফ হওয়া উচিত।

অন্যথায়, আপনি যদি দেখতে পান তবে কী ঘটতে পারে তা আপনি দেখতে পেয়েছিলেন:

// This has "race condition" written all around it
unlink($link);
touch($link);
unlink($link); // Remove the empty file
symlink($target, $link);

এটি যদি সমস্যার সমাধান না করে তবে সম্ভবত এই সমস্যাটির মতো এনজিনেক্সের সমস্যা হতে পারে ?

সমস্ত অপারেশনগুলি লগ ফাইলে লগ করার চেষ্টা করুন, আসলে কী ঘটে তা দেখতে see

অথবা হতে পারে...

... আপনি কি পুরোপুরি সিমলিংক ছাড়া করতে পারবেন ? উদাহরণস্বরূপ, একটি ডাটাবেস, মেমক্যাচ, এসকিউএলাইট ফাইল, বা একটি জেএসওএন ফাইল "ফাইলের নাম" এবং "প্রকৃত সিমলিংক লক্ষ্য" এর মধ্যে ম্যাপিং সংরক্ষণ করুন। উদাহরণস্বরূপ redis বা অন্যান্য কীস্টোরগুলি ব্যবহার করে, আপনি "ফাইলের নাম "টিকে আসল syMLink টার্গেটের সাথে যুক্ত করতে পারেন এবং ওএস রেজোলিউশনটিকে পুরোপুরি বাইপাস করতে পারেন।

ব্যবহারের ক্ষেত্রে উপর নির্ভর করে এটি সিমলিঙ্কগুলি ব্যবহার করার চেয়ে দ্রুত হতে পারে।


আমি দেখতে পেলাম না কীভাবে এটি এনজিনেক্সের সাথে সম্পর্কিত হতে পারে কারণ পিএইচপি প্রক্রিয়া এবং স্থানীয় ফাইল সিস্টেমের মধ্যে কোনও HTTP জিনিস মনে হয় না। মূল প্রক্রিয়া হওয়া কি কোনওভাবে প্রাসঙ্গিক করে তোলে?
বাহরাম আরদালান

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

হ্যাঁ. আমাদের "কীভাবে" জিনিসটিতে কিছুটা খনন করতে হবে।
বাহরাম আরদালান

1

দুটি সমস্যা ছিল যা সমস্যার কারণ ছিল।

প্রথম সমস্যা

আমি ইতিমধ্যে পোস্ট হিসাবে এবং প্রশ্নে সম্পাদনা করেছি। এটি Nginx কনফিগারেশন নিয়ে সমস্যা।

এই লাইনগুলি:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $document_root;

এর সাথে প্রতিস্থাপন করা দরকার:

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;

দ্বিতীয় সংখ্যা

দ্বিতীয় সংখ্যাটি কল clearstatcacheকরার আগে আমার কল করা দরকার ছিল file_get_contents। আমি clearstatcacheযখন একেবারে প্রয়োজনীয় তখনই কল করতে চাই , তাই আমি একটি ফাংশন লিখেছিলাম যা কেবল ক্যাশে সাফ করে যখন ডিরেক্টরিতে একটি অন্তর্ভুক্ত থাকে symlink

function file_get_contents1($dir)
{
    $realPath = realpath($dir);
    if ($realPath === false)
        return '';
    if ($dir !== $realPath)
    {
        clearstatcache(true);
    }
    return file_get_contents($dir);
}

1

এটি এখনও একটি বৈধ উত্তর হওয়ায় আমি আমার প্রথম উত্তরটি রেখে যাচ্ছি। আমি ক্লিয়ারস্ট্যাটচে (বাস্তব, $ ফাইলের নাম) প্রয়োগ করে @ ডানব্রে উত্তরটি উন্নত করছি।

দুটি সমস্যা ছিল যা সমস্যার কারণ ছিল।

প্রথম সমস্যা

আমি ইতিমধ্যে পোস্ট হিসাবে এবং প্রশ্নে সম্পাদনা করেছি। এটি Nginx কনফিগারেশন নিয়ে সমস্যা।

এই লাইনগুলি:

fastcgi_param SCRIPT_FILENAME $ ডকুমেন্ট_রোট $ ফাস্টসিজি_স্ক্রিপ্ট_নাম; fastcgi_param DOCUMENT_ROOT $ দস্তাবেজ_রোট;

এর সাথে প্রতিস্থাপন করা দরকার:

fastcgi_param SCRIPT_FILENAME $ realpath_root $ fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $ রিয়েলপথ_রোট;

দ্বিতীয় সংখ্যা

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

function file_get_contents1234_hard_drives($dir_go_1){
    $realPath = realpath($dir_go_1);
        $myDirectory=opendir(dirname($realPath));        
        while($entryName=readdir($myDirectory)) {
          $dirArray[]=$entryName;
        }

        /* Finds extensions of files used for my site theelectronichandbook.tech
        function findexts ($filename) {
          $filename=strtolower($filename);
          $exts=split("[/\\.]", $filename);
          $n=count($exts)-1;
          $exts=$exts[$n];
          return $exts;
        }*/

        // Closes directory
        closedir($myDirectory);

        // Counts elements in array
        $indexCount=count($dirArray);
        for($ArPos=1;$ArPos<=$indexCount;$ArPos++){
            /*used for my site theelectronichandbook.tech
            if($_SERVER['QUERY_STRING']=="hidden"){
                $H="";
                $af="./";
                $atext="Hide";
            }else{
                $H=".";
                $af="./?hidden";
                $at="Show";
            }*/
            if(strpos($dirArray[$ArPos], "Symlink") !== false){
                clearstatcache(true,$dir_go_1);
            }
        }
    return file_get_contents($dir_go_1);
}

আমি আমার ওয়েব-সার্ভারের সাথে উপরের কোডটি পরীক্ষা করেছি এবং এটি কার্যকর হয়েছে।


1
দুর্ভাগ্যক্রমে, এটি আমার ওয়েব সার্ভারে আমার পক্ষে কাজ করে না।
ড্যান ব্রে

আচ্ছা আমি আবার ড্রয়িং বোর্ডে যাব। @ ড্যানব্রে
জেটিএস

1
আপনাকে অনেক ধন্যবাদ, তবে দুর্ভাগ্যক্রমে, অনুগ্রহের সময়সীমা শেষ হওয়ার আগে খুব অল্প সময় পাওয়া যায়। তবে আপনি যদি সমাধানটির কথা চিন্তা করেন তবে আমি এতে 100% খুশি, আমি একটি অতিরিক্ত অনুদান প্রদান করব। এছাড়াও, file_get_contents1আমি যে কাঠামোর তৈরি করেছি তার একটি অংশ, সুতরাং এটি প্রচুর ব্যবহৃত হয়েছে, যা অপ্টিমাইজেশনকে গুরুত্বপূর্ণ করে তোলে।
ড্যান ব্রে

$dir_go=readdir("$realPath")নাল ফেরায়
ড্যান ব্রে

এটি পরিবর্তিত হতে পারে While($dir_go!==null)@ ড্যানব্রে
জেটিএস

0

কোডটি এমন কোনও উপাদানের ভিতরে রাখার চেষ্টা করুন যা জ্যাকুইর ব্যবহার করে ক্রমাগত সতেজ হয় এবং পুনরায় বৈধকরণ এবং স্থির ক্যাচ সাফ করার জন্য বাধ্য হয়। এই কোডটি @ নবীন মূল উত্তর থেকে পরিবর্তন করা হয়েছে ।

form.php:

 <meta http-equiv="Cache-Control" content="no-store, must-revalidate" />
 <meta http-equiv="Expires" content="0"/>
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
 <script> 
 jQuery(document).ready(function(){
    jQuery('.ajaxform').submit( function() {
        $.ajax({
            url     : $(this).attr('action'),
            type    : $(this).attr('method'),
            dataType: 'json',
            data    : $(this).serialize(),
            success : function( data ) {
                        // loop to set the result(value)
                        // in required div(key)
                        for(var id in data) {
                            jQuery('#' + id).html( data[id] );
                        }
                      }
        });
        return false;
    });
});
var timer, delay = 30;
timer = setInterval(function(){
    $.ajax({
      type    : 'POST',
      url     : 'profile.php',
      dataType: 'json',
      data    : $('.ajaxform').serialize(),
      success : function(data){
                  for(var id in data) {
                    jQuery('#' + id).html( data[id] );
                  }
                }
    }); }, delay);
 </script>
 <form action='profile.php' method='post' class='ajaxform'></form>
 <div id='result'></div>

profile.php:

 <?php
       // All form data is in $_POST
       // Now perform actions on form data here and create an result array something like this
       clearstatcache();
       $arr = array( 'result' => file_get_contents("./myfile.text") );
       echo json_encode( $arr );
 ?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.