Rumah > pembangunan bahagian belakang > tutorial php > Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J

Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J

Joseph Gordon-Levitt
Lepaskan: 2025-02-18 09:50:13
asal
562 orang telah melayarinya

Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J

Takeaways Key

    Melaksanakan garis masa pengguna untuk aplikasi sosial boleh mencabar dengan pangkalan data SQL atau NoSQL biasa kerana kerumitan pertanyaan dan kesan prestasi. Pangkalan data graf, seperti NEO4J, boleh menghapuskan isu -isu ini.
  • Teknik pemodelan biasa untuk suapan pengguna dalam pangkalan data graf adalah senarai yang dipautkan. Ini membolehkan akses segera ke jawatan terkini pengguna, tanpa memerlukan cap waktu untuk mengambil garis masa.
  • Tutorial menunjukkan bagaimana untuk memperluaskan aplikasi demo yang dibina di atas Silex untuk memodelkan suapan pengguna dengan cekap. Ia melibatkan membuat laluan untuk memaparkan suapan pengguna tertentu, mengambil suapan dari pangkalan data NEO4J, dan lulus mereka ke templat bersama dengan nod pengguna.
  • Untuk memaparkan garis masa pengguna, seseorang perlu mengambil semua pengguna yang dia ikuti dan mengembangkan pertanyaan kepada hubungan last_post dari setiap pengguna. Siaran kemudian ditapis oleh masa untuk memerintahkan mereka di antara pengguna.
  • Menambah jawatan ke garis masa melibatkan membuat nod pos, menghapuskan hubungan last_post dari pengguna ke Latest_post lama, mewujudkan hubungan baru antara node post terakhir dan pengguna, dan mewujudkan hubungan sebelumnya_post antara yang baru dan lama Node Post Last.
Mana -mana aplikasi sosial yang anda hadapi pada masa kini mempunyai garis masa, menunjukkan status rakan atau pengikut anda secara amnya dalam susunan masa yang menurun. Melaksanakan ciri sedemikian tidak pernah mudah dengan pangkalan data SQL atau NoSQL biasa.

Kerumitan pertanyaan, kesan prestasi meningkat dengan bilangan rakan/pengikut dan kesukaran untuk mengembangkan model sosial anda adalah titik yang data grafik menghapuskan.

Dalam tutorial ini, kami akan melanjutkan aplikasi demo yang digunakan oleh dua artikel pengenalan mengenai Neo4J dan PHP, masing -masing:

  • Cari pangkalan data graf dengan neo4j dan php

  • Menambah ciri rangkaian sosial ke aplikasi PHP dengan Neo4j

Aplikasi ini dibina di atas Silex dan mempunyai pengguna mengikuti pengguna lain. Matlamat sepanjang artikel ini adalah untuk memodelkan ciri suapan dengan cekap untuk mendapatkan dua jawatan terakhir orang yang anda ikuti dan memerintahkannya mengikut masa.

Anda akan menemui teknik pemodelan tertentu yang dipanggil senarai yang dipautkan dan beberapa pertanyaan lanjutan dengan cypher.

Kod sumber untuk artikel ini boleh didapati dalam repositori GitHub sendiri.

memodelkan garis masa dalam pangkalan data graf

Orang yang digunakan untuk teknik pemodelan pangkalan data lain cenderung mengaitkan setiap jawatan kepada pengguna. Jawatan akan mempunyai harta cap waktu dan perintah jawatan akan dilakukan terhadap harta ini.

Berikut adalah perwakilan yang mudah:

Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J Walaupun model sedemikian akan berfungsi tanpa sebarang masalah, terdapat beberapa kelemahan kepadanya:

  • Bagi setiap pengguna, anda perlu memesan jawatannya mengikut masa untuk mendapatkan yang terakhir
  • Operasi pesanan akan berkembang secara linear dengan jumlah jawatan dan pengguna yang anda ikuti
  • ia memaksa pangkalan data untuk melaksanakan operasi untuk pesanan

memanfaatkan kuasa pangkalan data graf

Node dalam pangkalan data graf memegang rujukan kepada sambungan yang dia ada, menyediakan prestasi cepat untuk traversals graf.

Teknik pemodelan biasa untuk suapan pengguna dipanggil senarai yang dipautkan. Dalam aplikasi kami, nod pengguna akan mempunyai hubungan yang dinamakan last_post ke jawatan terakhir yang dibuat oleh pengguna. Catatan ini akan mempunyai hubungan sebelumnya_post dengan yang sebelumnya yang juga mempunyai sebelumnya_post ke jawatan terdahulu kedua dan lain -lain ...

Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J

Dengan model ini, anda mempunyai akses segera ke jawatan terkini pengguna. Sebenarnya, anda tidak perlu mempunyai cap waktu untuk mengambil garis masa (kami akan menyimpannya walaupun, untuk menyusun jawatan di seluruh pengguna yang berbeza).

Lebih penting lagi, apa yang pengguna lakukan dalam masa dimodelkan secara semulajadi dalam pangkalan data graf. Mampu menyimpan data dengan cara yang sepadan dengan bagaimana data ini tinggal di luar pangkalan data adalah manfaat sebenar untuk analisis, mencari dan memahami data anda.

Persediaan Awal

Saya cadangkan anda memuat turun repositori yang digunakan untuk artikel pengenalan dan menamakannya semula kepada masa sosial sebagai contoh:

<span>git clone git@github.com:sitepoint-editors/social-network
</span><span>mv social-network social-timeline
</span>
<span>cd social-timeline
</span><span>rm -rf .git
</span><span>composer install
</span>bower <span>install</span>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Seperti dalam artikel sebelumnya, kami akan memuatkan pangkalan data dengan dataset dummy yang dihasilkan dengan bantuan Graphgen.

Anda perlu mempunyai pangkalan data yang sedang berjalan (tempatan atau jauh), pergi ke pautan ini, klik pada Generate dan kemudian pada "Populasi pangkalan data anda".

Jika anda menggunakan NEO4J 2.2, anda perlu menyediakan nama pengguna NEO4J dan kata laluan anda dalam kotak populator Graphgen:

Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J Ini akan mengimport 50 pengguna dengan log masuk, nama pertama dan nama belakang. Setiap pengguna akan mempunyai dua catatan blog, satu dengan hubungan last_post dengan pengguna dan satu dengan hubungan sebelumnya_post dengan suapan yang lain.

Jika anda kini membuka penyemak imbas NEO4J, anda dapat melihat bagaimana pengguna dan jawatan dimodelkan:

memaparkan suapan pengguna Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J

Permohonan sudah mempunyai satu set pengawal dan templat. Anda boleh memilih satu pengguna dengan mengkliknya dan ia akan memaparkan pengikut mereka dan beberapa cadangan orang untuk diikuti.

Laluan suapan pengguna

Pertama, kami akan menambah laluan untuk memaparkan suapan pengguna tertentu. Tambahkan bahagian kod ini ke hujung fail web/index.php

<span>git clone git@github.com:sitepoint-editors/social-network
</span><span>mv social-network social-timeline
</span>
<span>cd social-timeline
</span><span>rm -rf .git
</span><span>composer install
</span>bower <span>install</span>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pengawal suapan pengguna dan pertanyaan cypher

kami akan memetakan laluan ke tindakan dalam fail SRC/CONTROLLER/WEBCONTROLLER.PHP.

Dalam tindakan ini, kami akan mengambil suapan pengguna yang diberikan dari pangkalan data NEO4J dan lulus mereka ke templat bersama dengan nod pengguna.

<span>$app->get('/users/{user_login}/posts', 'Ikwattro\SocialNetwork\Controller\WebController::showUserPosts')
</span>    <span>->bind('user_post');</span>
Salin selepas log masuk
Salin selepas log masuk

beberapa penjelasan:

    kita mula -mula sepadan dengan pengguna dengan nama loginnya.
  • kami kemudian sepadan dengan suapan terakhir pengguna dan berkembang ke sebelumnya_feed (penggunaan kedalaman hubungan *0..2 akan berkuat kuasa untuk membenamkan nod terbaru_post di dalam koleksi nod pos) dan kami mengehadkan kedalaman maksimum ke 2.
  • kami mengembalikan suapan yang ditemui dalam koleksi.
memaparkan suapan dalam templat

kami terlebih dahulu akan menambah pautan dalam profil pengguna untuk mengakses suapan mereka, dengan hanya menambah baris ini selepas pada akhir blok maklumat pengguna:

<span>public function showUserPosts(Application $application, Request $request)
</span>    <span>{
</span>        <span>$login = $request->get('user_login');
</span>        <span>$neo = $application['neo'];
</span>        <span>$query = 'MATCH (user:User) WHERE user.login = {login}
</span><span>        MATCH (user)-[:LAST_POST]->(latest_post)-[PREVIOUS_POST*0..2]->(post)
</span><span>        RETURN user, collect(post) as posts';
</span>        <span>$params = ['login' => $login];
</span>        <span>$result = $neo->sendCypherQuery($query, $params)->getResult();
</span>
        <span>if (null === $result->get('user')) {
</span>            <span>$application->abort(404, 'The user $login was not found');
</span>        <span>}
</span>
        <span>$posts = $result->get('posts');
</span>
        <span>return $application['twig']->render('show_user_posts.html.twig', array(
</span>            <span>'user' => $result->getSingle('user'),
</span>            <span>'posts' => $posts,
</span>        <span>));
</span>    <span>}</span>
Salin selepas log masuk
Salin selepas log masuk
Kami kini akan membuat templat kami yang menunjukkan garis masa pengguna (jawatan). Kami menetapkan tajuk dan gelung yang melancarkan koleksi suapan kami untuk memaparkannya dalam div HTML yang berdedikasi:

<span><span><span><p</span>></span><span><span><a</span> href<span>="{{ path('user_post', {user_login: user.property('login') }) }}"</span>></span>Show posts<span><span></a</span>></span><span><span></p</span>></span></span>
Salin selepas log masuk
Jika anda kini memilih pengguna dan klik pada pautan

Pameran Pengguna , anda dapat melihat bahawa siaran kami dipaparkan dengan baik dan diperintahkan dengan menurun masa tanpa menentukan harta tarikh.

memaparkan garis masa Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J

Jika anda telah mengimport dataset sampel dengan Graphgen, setiap pengguna anda akan mengikuti kira -kira 40 pengguna lain.

Untuk memaparkan garis masa pengguna, anda perlu mengambil semua pengguna yang dia ikuti dan mengembangkan pertanyaan ke hubungan last_post dari setiap pengguna.

Apabila anda mendapat semua siaran ini, anda perlu menapisnya dengan masa untuk memerintahkan mereka antara pengguna.

Laluan Garis Masa Pengguna

Proses ini adalah sama dengan yang sebelumnya - kami menambah laluan ke index.php, kami membuat tindakan pengawal kami, kami menambah pautan ke garis masa dalam templat profil pengguna dan kami membuat templat garis masa pengguna kami.

Tambahkan laluan ke fail web/index.php

Tindakan pengawal:

{% extends "layout.html.twig" %}

{% block content %}
    <span><span><span><h1</span>></span>Posts for {{ user.property('login') }}<span><span></h1</span>></span>
</span>
    {% for post in posts %}
        <span><span><span><div</span> class<span>="row"</span>></span>
</span>        <span><span><span><h4</span>></span>{{ post.properties.title }}<span><span></h4</span>></span>
</span>        <span><span><span><div</span>></span>{{ post.properties.body }}<span><span></div</span>></span>
</span>        <span><span><span></div</span>></span>
</span>        <span><span><span><hr</span>/></span>
</span>    {% endfor %}

{% endblock %}
Salin selepas log masuk

penjelasan mengenai pertanyaan:

<span>$app->get('/user_timeline/{user_login}', 'Ikwattro\SocialNetwork\Controller\WebController::showUserTimeline')
</span>    <span>->bind('user_timeline');</span>
Salin selepas log masuk

pertama kita sepadan dengan pengguna kita.

    maka kita sepadan dengan jalan antara pengguna ini, pengguna lain yang dia ikuti dan suapan terakhir mereka (lihat di sini bagaimana Cypher benar -benar ekspresif tentang apa yang anda mahu ambil).
  • kami memesan suapan dengan timestamp mereka.
  • kami mengembalikan suapan dalam koleksi yang mengandungi pengarang dan suapan.
  • Kami mengehadkan hasilnya kepada 20 suapan.
  • tambahkan pautan ke templat profil pengguna, hanya selepas pautan suapan pengguna:

dan buat templat garis masa:

<span>public function showUserTimeline(Application $application, Request $request)
</span>    <span>{
</span>        <span>$login = $request->get('user_login');
</span>        <span>$neo = $application['neo'];
</span>        <span>$query = 'MATCH (user:User) WHERE user.login = {user_login}
</span><span>        MATCH (user)-[:FOLLOWS]->(friend)-[:LAST_POST]->(latest_post)-[:PREVIOUS_POST*0..2]->(post)
</span><span>        WITH user, friend, post
</span><span>        ORDER BY post.timestamp DESC
</span><span>        SKIP 0
</span><span>        LIMIT 20
</span><span>        RETURN user, collect({friend: friend, post: post}) as timeline';
</span>        <span>$params = ['user_login' => $login];
</span>        <span>$result = $neo->sendCypherQuery($query, $params)->getResult();
</span>
        <span>if (null === $result->get('user')) {
</span>            <span>$application->abort(404, 'The user $login was not found');
</span>        <span>}
</span>
        <span>$user = $result->getSingle('user');
</span>        <span>$timeline = $result->get('timeline');
</span>
        <span>return $application['twig']->render('show_timeline.html.twig', array(
</span>            <span>'user' => $result->get('user'),
</span>            <span>'timeline' => $timeline,
</span>        <span>));
</span>    <span>}</span>
Salin selepas log masuk

kami kini mempunyai garis masa yang cukup sejuk yang menunjukkan 20 suapan terakhir orang yang anda ikuti yang cekap untuk pangkalan data.

Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J

Menambah jawatan ke garis masa

Untuk menambah jawatan ke senarai yang dipautkan, pertanyaan cypher sedikit lebih

ricky . Anda perlu membuat nod pos, keluarkan hubungan last_post dari pengguna ke Latest_Post lama, buat hubungan baru antara node post yang terakhir dan pengguna dan akhirnya membuat hubungan sebelumnya_post antara node post yang baru dan lama.

mudah, bukan? Mari kita pergi!

Seperti biasa, kami akan membuat laluan pos untuk borang yang menunjuk kepada tindakan WebController:

<span>git clone git@github.com:sitepoint-editors/social-network
</span><span>mv social-network social-timeline
</span>
<span>cd social-timeline
</span><span>rm -rf .git
</span><span>composer install
</span>bower <span>install</span>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Seterusnya, kami akan menambah borang HTML asas untuk memasukkan tajuk pos dan teks dalam templat pengguna:

<span>$app->get('/users/{user_login}/posts', 'Ikwattro\SocialNetwork\Controller\WebController::showUserPosts')
</span>    <span>->bind('user_post');</span>
Salin selepas log masuk
Salin selepas log masuk
Dan akhirnya, kami membuat tindakan baru kami:

<span>public function showUserPosts(Application $application, Request $request)
</span>    <span>{
</span>        <span>$login = $request->get('user_login');
</span>        <span>$neo = $application['neo'];
</span>        <span>$query = 'MATCH (user:User) WHERE user.login = {login}
</span><span>        MATCH (user)-[:LAST_POST]->(latest_post)-[PREVIOUS_POST*0..2]->(post)
</span><span>        RETURN user, collect(post) as posts';
</span>        <span>$params = ['login' => $login];
</span>        <span>$result = $neo->sendCypherQuery($query, $params)->getResult();
</span>
        <span>if (null === $result->get('user')) {
</span>            <span>$application->abort(404, 'The user $login was not found');
</span>        <span>}
</span>
        <span>$posts = $result->get('posts');
</span>
        <span>return $application['twig']->render('show_user_posts.html.twig', array(
</span>            <span>'user' => $result->getSingle('user'),
</span>            <span>'posts' => $posts,
</span>        <span>));
</span>    <span>}</span>
Salin selepas log masuk
Salin selepas log masuk
beberapa penjelasan:

Kami mula -mula sepadan dengan pengguna, maka kami secara pilihan memadankan nod last_postnya.
  • kami memadam hubungan antara pengguna dan jawatan terakhirnya yang paling baru.
  • Kami mencipta jawatan baru kami (yang sebenarnya adalah jawatan terakhirnya dalam garis masa kehidupannya yang sebenar).
  • Kami mewujudkan hubungan antara pengguna dan jawatan terakhirnya yang "baru".
  • Kami memecahkan pertanyaan dan lulus pengguna, jawatan terakhir dan koleksi Latest_posts lama.
  • Kami kemudian melangkah ke atas koleksi dan mencipta hubungan sebelumnya_post antara jawatan terakhir yang baru dan yang seterusnya.
  • Bahagian yang rumit di sini, ialah koleksi OldLatestPosts akan selalu mengandungi 0 atau 1 elemen, yang sesuai untuk pertanyaan kami.

Kesimpulan Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J

Dalam artikel ini, kami dapati teknik pemodelan yang dipanggil Linked List, belajar bagaimana untuk melaksanakannya dalam aplikasi sosial dan bagaimana untuk mendapatkan nod dan hubungan dengan cara yang cekap. Kami juga mempelajari beberapa klausa cypher baru seperti Skip and Limit, berguna untuk penomboran.

Walaupun garis masa dunia sebenar agak lebih kompleks daripada apa yang kita lihat di sini, saya harap ia jelas bagaimana pangkalan data grafik seperti NEO4J benar -benar adalah pilihan terbaik untuk jenis aplikasi ini.

Soalan Lazim (Soalan Lazim) Mengenai Garis Masa Pengguna yang cekap dalam Aplikasi PHP dengan Neo4J

Bagaimanakah saya dapat memvisualisasikan data garis masa saya di Neo4J? Alat ini membolehkan anda membuat garis masa interaktif, dinamik, dan visual yang menarik. Anda boleh menyesuaikan garis masa untuk memenuhi keperluan anda, menambah acara, dan juga menghubungkannya dengan acara lain. Ini memudahkan untuk memahami hubungan dan corak dalam data anda.

Bagaimana saya boleh menggunakan NEO4J untuk menganalisis data Twitter? Ini melibatkan pengekstrakan data dari Twitter, mengimportnya ke NEO4J, dan kemudian menggunakan pertanyaan cypher untuk menganalisis data. Garis masa visual dapat membantu mendedahkan corak dan trend dalam data, seperti aktiviti pengguna tertentu atau penyebaran hashtag tertentu. Peristiwa garis masa di NEO4J boleh diwakili sebagai nod dan hubungan. Setiap acara adalah nod, dan hubungan di antara mereka mewakili urutan peristiwa. Anda boleh menggunakan sifat pada nod dan hubungan untuk menyimpan maklumat tambahan mengenai peristiwa -peristiwa, seperti masa mereka berlaku atau tempohnya. Pelbagai versi PHP. Walau bagaimanapun, ia sentiasa disyorkan untuk menggunakan versi stabil PHP terkini untuk prestasi dan keselamatan terbaik. Anda boleh menyemak laman web PHP rasmi untuk maklumat mengenai versi yang disokong sekarang.

Bagaimana PHP berkembang selama bertahun -tahun? Ia bermula sebagai bahasa skrip mudah untuk pembangunan web tetapi telah berkembang menjadi bahasa pengaturcaraan penuh dengan sokongan untuk pengaturcaraan berorientasikan objek, pengaturcaraan berfungsi, dan banyak lagi. Setiap versi baru PHP membawa penambahbaikan prestasi, keselamatan, dan ciri -ciri. beberapa strategi. Ini termasuk mengoptimumkan pertanyaan cypher anda, menggunakan indeks untuk mempercepat pengambilan data, dan menguruskan sambungan pangkalan data anda dengan cekap. Di samping itu, anda harus sentiasa menggunakan versi terkini PHP dan NEO4J untuk prestasi terbaik. Ini termasuk menggunakan sambungan pangkalan data yang selamat, membersihkan input pengguna untuk mencegah serangan suntikan, dan melaksanakan pengendalian ralat yang betul. Di samping itu, anda harus sentiasa menyimpan perisian PHP dan Neo4J anda sehingga kini mendapat manfaat daripada patch keselamatan terkini. Aplikasi PHP dengan NEO4J boleh dilakukan dengan menggunakan blok percubaan. Ini membolehkan anda menangkap apa -apa pengecualian yang berlaku semasa pelaksanaan kod anda dan mengendalikannya dengan sewajarnya. Anda juga boleh menggunakan pembalakan ralat untuk menjejaki sebarang isu yang berlaku. Ini termasuk menggunakan ciri kluster NEO4J untuk mengedarkan data anda merentasi pelbagai pelayan, mengoptimumkan skema pangkalan data anda dan pertanyaan untuk prestasi, dan menggunakan caching untuk mengurangkan beban pangkalan data.

Bagaimana saya boleh memindahkan aplikasi PHP saya yang sedia ada untuk menggunakan Neo4J? Pertama, anda perlu memodelkan data anda sebagai graf dan mengimportnya ke NEO4J. Kemudian, anda perlu mengemas kini kod aplikasi anda untuk menggunakan pemacu PHP NEO4J untuk operasi pangkalan data. Akhirnya, anda perlu menguji permohonan anda dengan teliti untuk memastikan ia berfungsi dengan betul dengan neo4j.

Atas ialah kandungan terperinci Garis masa pengguna yang cekap dalam aplikasi PHP dengan NEO4J. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan