{"id":17,"date":"2009-07-10T09:55:19","date_gmt":"2009-07-10T07:55:19","guid":{"rendered":"https:\/\/www.opengis.ch\/?p=17"},"modified":"2020-04-29T16:08:00","modified_gmt":"2020-04-29T14:08:00","slug":"symfony-project-on-bluehost-shared-hosting","status":"publish","type":"post","link":"https:\/\/www.opengis.ch\/de\/2009\/07\/10\/symfony-project-on-bluehost-shared-hosting\/","title":{"rendered":"Symfony project on (bluehost) shared hosting"},"content":{"rendered":"<p>So, I finally made it, set up a working <a href=\"https:\/\/www.symfony-project.org\">Symfony<\/a> project (with SVN) on my bluehost shared hosting plan, this tutorial should work for other hosters with minor changes. What I wanted was to be able of using my account as a development server for a small group of developers that would automatically show the last revision of the SVN repository. I pushed the solution further and created on the same account two more subdomains for the staging and production server. Please note that this last point is not the best thing to do, but I did it since we don&#8217;t know yet where we will put our production server when the application will really go live. As well, small budget apps could be set up this way if you really want 3 environments and you can&#8217;t afford a better hosting solution. Finally I installed <a href=\"https:\/\/www.redmine.org\/\">Redmine<\/a> so that we&#8217;ve a fully integrated development server with issues tracking, road-map, wiki, documentation and repository browsing.<!--more--><br \/>\nPlease note that bluehost uses something that looks like chroot jails, but read <a href=\"https:\/\/trac.symfony-project.org\/wiki\/SharedHostingNotSecure\">here<\/a> for some concerns about symfony on shared hosts. Furthermore, i never use https in this tutorial, since I m using this as a test platform. As well this solution symlinks a www available folder to a folder outside public_html which could have some security implications. So remember security is as strong as the weakest link and YOU need to take care of it.<\/p>\n<p>\nSince setting up the whole thing it was a bit of an hassle, here how I did it (you need ssh acces to your account):<\/p>\n<ul>\n<li><a href=\"#subdomains\">Setup subdomains and working folders<\/a><\/li>\n<li><a href=\"#install-svn\">Install Subversion (SVN)<\/a><\/li>\n<li><a href=\"#setup-svn\">Setup Subversion (SVN)<\/a><\/li>\n<li><a href=\"#setup-symfony\">Setup Symfony (with doctrine ORM)<\/a><\/li>\n<li><a href=\"#symfony-clone\">Cloning .\/symfony for use over http<\/a><\/li>\n<li><a href=\"#post-commit-hook\">SVN post-commit hook<\/a><\/li>\n<li><a href=\"#install-redmine\">Install Redmine (not mandatory)<\/a><\/li>\n<\/ul>\n<h3><a name=\"subdomains\"><\/a>Setup subdomains and working folders<\/h3>\n<p>I decided to have the following structure:<\/p>\n<ul>\n<li>\/home\/YOURACCOUNT\/DEDICATEDFOLDER\/dev\/  (dev.domain.com)<\/li>\n<li>\/home\/YOURACCOUNT\/DEDICATEDFOLDER\/stage\/ (stage.domain.com)<\/li>\n<li>\/home\/YOURACCOUNT\/DEDICATEDFOLDER\/prod\/ (domain.com)<\/li>\n<\/ul>\n<p>each of this folders will be the root of the relative environment of the symfony project. This folders are NOT accessible from the web, we will create symlinks later for that purpose.<\/p>\n<ul>\n<li>\/home\/YOURACCOUNT\/public_html\/dev\/web<\/li>\n<li>\/home\/YOURACCOUNT\/public_html\/stage\/web<\/li>\n<li>\/home\/YOURACCOUNT\/public_html\/addonDOMAIN_web (nb no prod)<\/li>\n<\/ul>\n<p>In cpanel create the two subdomains (dev and stage) and point them to the relative folders in public_html (NB, I worked with an add-on domain so when i created it I just pointed it to addonDOMAIN_web, if you want to do it with your main domain, you should be able to do so with a redirection or so). Now we need to delete this folders and create the symlinks (remember you CAN point a symlink to a folder that does not exist [yet]).<\/p>\n<pre lang='Bash'>cd \/home\/YOURACCOUNT\/public_html\/\nrm -rf dev\/web\/ stage\/web web\/\nln -s \/home\/YOURACCOUNT\/DEDICATEDFOLDER\/dev\/web\/ dev\/web\nln -s \/home\/YOURACCOUNT\/DEDICATEDFOLDER\/stage\/web\/ stage\/web\nln -s \/home\/YOURACCOUNT\/DEDICATEDFOLDER\/prod\/web\/ addonDOMAIN_web\n<\/pre>\n<p>You are done, now your (sub)domains point to the web folder of the symfony project. The free bite is that you can control the access to the \/home\/YOURACCOUNT\/public_html\/dev or stage folder with .htacces files so that your dev and stage environment are accessible only to who you want.\n<\/p>\n<h3><a name=\"install-svn\"><\/a>Install Subversion (SVN)<\/h3>\n<p>well, I had done this a while ago and I don&#8217;t recall exactly each step I did, but I successfully installed SVN 1.5.4. Just google for installing SVN on bluehost and there are plenty of blogs\/forums discussing it. For example <a href=\"https:\/\/www.bluehostforum.com\/showpost.php?p=67753&#038;postcount=25\">here<\/a>.<\/p>\n<h3><a name=\"setup-svn\"><\/a>Setup Subversion (SVN)<\/h3>\n<p>Once you have installed SVN, you are ready to go. Create a folder for your repos in your home and then your repository<\/p>\n<pre lang='Bash'>cd\nmkdir svnRepositories\ncd svnRepositories\nsvnadmin create yourRepo\n<\/pre>\n<p>now your repo is accessible to you at <\/p>\n<pre lang='Bash'>svn+ssh:\/\/YOURACCOUNT@domain.com\/home\/YOURACCOUNT\/svnRepositories\/yourRepo<\/pre>\n<\/p>\n<p>To access this you will be prompted for your account password, which (of course) you don&#8217;t want to type every time nor give to other developer. Luckily enough SSH keys come handy.<br \/>\nTo avoid typing the password every time you want to connect to your account just set up a key pair for yourself and upload the public key to the server (this can be done very easily in cpanel or by coping the .pub file in .ssh on you account and by coping the key in the .ssh\/authorized_keys AND .ssh\/authorized_keys2 file &#8211; ervey key a new line).<\/p>\n<p>Now, you could do the same for the other developers but this would mean granting them the full access to your account. Again, SSH comes very handy, do the same as above for each new developer BUT prepend this to their public key in the .ssh\/authorized_keys AND .ssh\/authorized_keys2 file:<\/p>\n<pre lang='Bash'>command=\"\/home\/YOURACCOUNT\/bin\/svnserve -t -r \/home\/YOURACCOUNT\/svnRepositories\/yourRepo --tunnel-user=DEVNAME\",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty<\/pre>\n<p>this will authorize the key only for svnserve (which is what we need to use svn) and specifies the svn username of the developer (if you plan on installing redmine, you will be able to map this to a redmine username).<br \/>\nso, the .ssh\/authorized_keys AND .ssh\/authorized_keys2 file would look like this:<\/p>\n<pre lang='Bash'>ssh-rsa AAAB3NzaC1yc2EAAAABIwAAAQEA6mrAlzDrYE3xQTK\/G0IzQGYvW0prZuKEgPlpc3iCuLmkUF20UVcixem45W7u5A3nJR2N953jNc3t0z93PK5bL2UsaLdQAy33XjovxhCdJjtXDaNUpIesh\/n5po7XJ9DWH2gdIJGedtNiTLYTmpQzL9GM\/30yEE4XXOjJGAxObsceNUt0lBINKOERYXoJFxvqSoU9Prs7dpRX9sEsAIX98rkDkEVEZIYNMbYOPiWNVbcnbMXLVEYwIxoz+8cbqeaiaWHL3k5pKjTeUzCd4a+YJ2zYQYREK8cNeanuCL6kvFv55nv1kf4KoWw7L8kvf3lLqZXnpShTKcHPfWI0cETd3Q== my id_rsa.pub\ncommand=\"\/home\/YOURACCOUNT\/bin\/svnserve -t -r \/home\/YOURACCOUNT\/svnRepositories\/yourRepo --tunnel-user=jonnyDev\",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA2qCnsU3zC0FN4fMXqd4hQbwc31Q3EGZk6ruWGEv\/IyA+e2bnQJhR1pjCruQ3OeB9ZG3BlBNKXPcDZ9sRYbBjQ\/Hs5FLTd\/IhMUcrfZGB3mN0yQeAhFvbD4IXEfGsqVD8sO79S7LH5IPsHpJWthZxZ8fUPXi7u6OmbX\/LS\/xlXBf60uttlTuPBFAhpNoGeR75FSAFg0ZhW6NFhbBVplB2jrD3amEJBbSfD88GMmUngwtvGn5Lr7v\/dEhXiAMa25BorA6086hn11aDFLTaGJnz7Ne\/jdPwCeEobi40X5ZHmHW7\/eyACpYmcoVBEph7wV5W+uJ09ZoLl\/\/n\/PLPYEpTpw== jonnyDev jonnyDev.pub\n<\/pre>\n<\/p>\n<p>After this, you can access your account without password and the other developers can do the same but only for SVN purposes. The only difference is that the developers will have to use<\/p>\n<pre lang='Bash'>svn+ssh:\/\/YOURACCOUNT@domain.com\/<\/pre>\n<p> to checkout and commit to the repository.<\/p>\n<p>Now you should initialize your repository for example by creating the standard folders &#8222;trunk, branches, tags&#8220;.<br \/>\nlocally (not on the server) do:<\/p>\n<pre lang='Bash'>mkdir ~\/tmp\/\ncd ~\/tmp\/\nmkdir trunk branches tags\nsvn checkout svn+ssh:\/\/YOURACCOUNT@domain.com\/home\/YOURACCOUNT\/svnRepositories\/yourRepo\nsvn add *\nsvn commit -m\"initialize folder structure\"\nrm ~\/tmp\/<\/pre>\n<p>Your repository is ready and you can tell your developers to check out the trunk (or whatever you want) with <\/p>\n<pre lang='Bash'>svn co svn+ssh:\/\/YOURACCOUNT@domain.com\/trunk localDir<\/pre>\n<\/p>\n<h3><a name=\"setup-symfony\"><\/a>Setup Symfony (with doctrine ORM)<\/h3>\n<p>based on <a href=\"https:\/\/www.symfony-project.org\/jobeet\/1_2\/Doctrine\/en\/01\">Symfony tutorial<\/a> and <a href=\"https:\/\/stereointeractive.com\/blog\/2008\/12\/10\/starting-a-new-symfony-project\/\">this blog entry<\/a><\/p>\n<p>Checkout the repository (probably only the trunk) to the folder you want your application to reside into, and cd into the trunk. All following comands will be performed from the root of the trunk directory (the root of our new symfony application).<\/p>\n<pre lang='Bash'>cd ~\/symApps\/trunk\nsvn mkdir lib\nsvn mkdir lib\/vendor\nsvn propedit svn:externals lib\/vendor<\/pre>\n<p>after the propedit comand, an editor will open, enter <\/p>\n<pre lang='Bash'>symfony https:\/\/svn.symfony-project.com\/tags\/RELEASE_1_2_7\/\n#or the most uptodate tagged version\n#or symfony https:\/\/svn.symfony-project.com\/branches\/1.2\/ if you want the DEV version<\/pre>\n<p>now commit your changes<\/p>\n<pre lang='Bash'>svn commit -m \"added symfony as external in lib\/vendor\"\nsvn update lib\/vendor<\/pre>\n<p>Now check if symfony works:<\/p>\n<pre lang='Bash'>php lib\/vendor\/symfony\/data\/bin\/check_configuration.php\nphp lib\/vendor\/symfony\/data\/bin\/symfony -V<\/pre>\n<p>this should print out some information on your configuration  and the symfony version.<\/p>\n<p>\nYou are now ready to create the project <\/p>\n<pre lang='Bash'>php lib\/vendor\/symfony\/data\/bin\/symfony generate:project yourproject<\/pre>\n<p>and to create the frontend application<\/p>\n<pre lang='Bash'>symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend<\/pre>\n<p>For better portability, change the absolute path to the symfony installation to a relative one:<\/p>\n<pre lang='PHP'>\/\/ config\/ProjectConfiguration.class.php\nrequire_once dirname(__FILE__).'\/..\/lib\/vendor\/symfony\/lib\/autoload\/sfCoreAutoload.class.php';<\/pre>\n<\/p>\n<p>Now we put the project into SVN:<\/p>\n<pre lang='Bash'>rm -rf cache\/*\nrm -rf log\/*\nchmod 777 cache\nchmod 777 log\nsvn add *\nsvn propedit svn:ignore log #enter * in the editor\nsvn propedit svn:ignore cache #enter * in the editor\nsvn ci -m \"creating project structure\"<\/pre>\n<h3><a name=\"symfony-clone\"><\/a>Cloning .\/symfony for use over http<\/h3>\n<p>Unfortunately, bluehost has no PDO on its CLI PHP, which means that we CAN&#8217;T run any doctrine tasks using the comand line&#8230; pretty annoying (how could reset the dev DB after each commit). To be able to perform this tasks we need to be able to call symfony using wget (or curl). To do so we create a symfony_dev.php file in the web folder of our project (like a controller, i suggest calling it *_dev.php so it won&#8217;t be deployed to the prod server by the deploy task) and a copy of .\/symfony (named for example symfony.php) in the root of the project. To avoid an erro page to be displayed you need to add a line with an echo statement to Symfony.php like this:<\/p>\n<pre lang='PHP'>echo \"CLI output: n\";\nchdir(dirname(__FILE__));\nrequire_once(dirname(__FILE__).'\/config\/ProjectConfiguration.class.php');\ninclude(sfCoreAutoload::getInstance()->getBaseDir().'\/command\/cli.php');<\/pre>\n<p>The web\/symfony_dev.php should look like that:<\/p>\n<pre lang='PHP'><?php\n\/*\n * @author: Marco Bernasocchi (https:\/\/www.bernawebdesign.ch)\n * @license: https:\/\/www.gnu.org\/licenses\/gpl-3.0.html * wrapper that calls a clone of .\/symfony to allow using .\/symfony without CLI by calling this file with wget like this:\n * wget symfony_dev.php?cmd=doctrine:build-all-reload --env=dev --no-confirmation\n * this is needed when the PHP CLI has no PDO\n *\/\n\/\/ this check prevents access to debug front controllers that are deployed by accident to production servers.\n\/\/ feel free to remove this, extend it or make something more sophisticated.\nif (!(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')) || in_array(@$_SERVER['HTTP_HOST'], array('dev.DOMAIN.com'))))\n{\n  die('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');\n}\nif (!beginsWith($_GET['cmd'],'doctrine:'))\n{\n  die('To run tasks that do not need PDO (for example Doctrine), use the real comand line');\n}\n$cmd = explode(' ', $_GET['cmd']); \/\/gets the cmd param from the get, for example doctrine:build-all-reload --env=dev --no-confirmation\narray_unshift($cmd, '.\/symfony');\n\/\/sets the arguments needed for the CLI\n$_SERVER['argv'] = $cmd;\n$_SERVER['argc'] = count($_SERVER['argv']);\n\/\/calling the clone\nrequire_once('..\/symfony.php');\nfunction beginsWith( $str, $sub ) {\n   return ( substr( $str, 0, strlen( $sub ) ) == $sub );\n}\n?><\/pre>\n<h3><a name=\"post-commit-hook\"><\/a>SVN post-commit hook (or putting it all together)<\/h3>\n<p>The goal was to have a fresh snapshot of the dev site every time a commit is performed, that means that we need to customize our post-commit hook, so open up \/home\/YOURACCOUNT\/svnRepositories\/yourRepo\/hooks\/post-commit and add the following code:<\/p>\n<pre lang='Bash'>#!\/bin\/sh\n# POST-COMMIT HOOK\nREPOS=\"$1\"\nREV=\"$2\"\n#export the dev version of the site\nrm -rf \/home\/YOURACCOUNT\/DEDICATEDFOLDER\/dev\/\n\/home\/YOURACCOUNT\/bin\/svn export file:\/\/\/home\/YOURACCOUNT\/svnRepositories\/yourRepo\/trunk\/ \/home\/YOURACCOUNT\/DEDICATEDFOLDER\/dev\/\n#update the redmine(issues tracker) DB\n#ruby \/home\/YOURACCOUNT\/railsApps\/redmine\/script\/runner \"Repository.fetch_changesets\" -e production\n#move into dev project root\ncd \/home\/YOURACCOUNT\/DEDICATEDFOLDER\/dev\/\n#initiate log.txt\necho -e \"###NEW COMMIT \"$REPOS\" rev:\"$REV\" \"$(date -u +\"%F_%T %Z\")\"n\" > log.txt\n#reset application DB\n#calls the http version of .\/symfony doctrine:build-all-reload --env=dev --no-confirmation\nwget -o log.tmp -O CLI_output.tmp --user=HTTPUSER_dev --password=PASSW https:\/\/dev.domain.com\/symfony_dev.php?cmd=doctrine:build-all-reload%20--env=dev%20--no-confirmation\ncat log.tmp\t>> log.txt\ncat CLI_output.tmp\t>> log.txt\nrm -f log.tmp CLI_output.tmp\necho -e \"n\" >> log.txt\n#clear symfony cache\n.\/symfony cc >> log.txt\n#commit-email.pl \"$REPOS\" \"$REV\" commit-watchers@example.org\n#log-commit.py --repository \"$REPOS\" --revision \"$REV\"\ncat log.txt >> ..\/logs\/dev\/symfonyCommitlog.txt\n#cat log.txt\nrm -f log.txt<\/pre>\n<\/p>\n<h3><a name=\"install-redmine\"><\/a>Install Redmine (not mandatory)<\/h3>\n<p>Finally, to install redmine follow my <a href=\"https:\/\/www.opengis.ch\/2009\/07\/02\/installing-redmine-on-bluehost-shared-hosting\/\">previous post<\/a>, disable the &#8222;autofetch commits&#8220; option in the administration page (settings?tab=repositories) and uncomment the following line to your post-commit hook:<\/p>\n<pre lang='Bash'>ruby \/home\/fotolion\/railsApps\/redmine\/script\/runner \"Repository.fetch_changesets\" -e production<\/pre>\n<p>this will trigger the update of redmine&#8217;s DB after each commit. On the same page you can map redmine usersnames to svn usernames to have tight coupling even at this level.<\/p>\n<h3>Conclusion<\/h3>\n<p>I&#8217;ve shown how to create a symfony development environment on a shared hosting where PDO is not available on the command line PHP. Furthermore I shown how to add it to subversion and how to integrate everything together thanks to redmine.<br \/>\nnow you are ready to do some &#8222;rock solid development on a shoestring&#8220; \ud83d\ude42<br \/>\nenjoy Marco<\/p>\n","protected":false},"excerpt":{"rendered":"<p>set up a working Symfony project (with SVN) on my bluehost shared hosting, this tutorial should work for other hosters with minor changes. What I wanted was to be able of using my account as a development server for a small group of developers that would automatically show the last revision of the SVN repository. I pushed the solution further and created on the same account two more subdomains for the staging and production server.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[28],"tags":[125,93],"class_list":["post-17","post","type-post","status-publish","format-standard","hentry","category-web-development","tag-qgis-org","tag-symfony"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":60,"url":"https:\/\/www.opengis.ch\/de\/2009\/07\/14\/activating-error-503-from-a-shell-script\/","url_meta":{"origin":17,"position":0},"title":"Activating error 503 from a shell script","author":"Marco Bernasocchi","date":"14. Juli 2009","format":false,"excerpt":"During deployment of a new version of a website you might want to have your server returning an error 503 (temporarily unavailable). here a solution","rel":"","context":"In &quot;Web Development&quot;","block_context":{"text":"Web Development","link":"https:\/\/www.opengis.ch\/de\/category\/web-development\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":99,"url":"https:\/\/www.opengis.ch\/de\/2009\/09\/17\/adapting-doctrineexport-grt-lua-to-symfony-standards\/","url_meta":{"origin":17,"position":1},"title":"Adapting doctrineexport.grt.lua to symfony standards","author":"Marco Bernasocchi","date":"17. September 2009","format":false,"excerpt":"Using Mysql workbench to visually design a data model for a symfony application is pretty cool. Thanks to the guys of https:\/\/code.google.com\/p\/mysql-workbench-doctrine-plugin\/ you can export the model to a YAML file ready for Doctrine. the only problem I found using version 0.36 is that classes names are not in UpperCamelCase\u2026","rel":"","context":"In &quot;Web Development&quot;","block_context":{"text":"Web Development","link":"https:\/\/www.opengis.ch\/de\/category\/web-development\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":108,"url":"https:\/\/www.opengis.ch\/de\/2009\/10\/10\/mysql-world-database-as-yaml-fixture\/","url_meta":{"origin":17,"position":2},"title":"MySql World Database as YAML fixture","author":"Marco Bernasocchi","date":"10. Oktober 2009","format":false,"excerpt":"For Symfony application I'm developing I needed all the Region separated by continent (7 continents model). I converted the MySql World Database (https:\/\/dev.mysql.com\/doc\/world-setup\/en\/world-setup.html) to a YAML NestedSet fixture file. I just had to make 4 minor changes to it: - rename the 3 continents that had region with the same\u2026","rel":"","context":"In &quot;Web Development&quot;","block_context":{"text":"Web Development","link":"https:\/\/www.opengis.ch\/de\/category\/web-development\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4497,"url":"https:\/\/www.opengis.ch\/de\/2009\/07\/02\/installing-redmine-on-bluehost-shared-hosting\/","url_meta":{"origin":17,"position":3},"title":"Installing Redmine on (bluehost) shared hosting","author":"Marco Bernasocchi","date":"2. Juli 2009","format":false,"excerpt":"script to install readmine 0.8.4 on a shared host that offers ruby on rails.","rel":"","context":"In &quot;Web Development&quot;","block_context":{"text":"Web Development","link":"https:\/\/www.opengis.ch\/de\/category\/web-development\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":116,"url":"https:\/\/www.opengis.ch\/de\/2010\/02\/17\/custom-php-5-3-1-with-apc-and-xdebug-on-dreamhost-shared-hosting\/","url_meta":{"origin":17,"position":4},"title":"Custom PHP 5.3.1 with APC and XDEBUG on (Dreamhost) Shared Host","author":"Marco Bernasocchi","date":"17. Februar 2010","format":false,"excerpt":"I've recently been setting up my new dreamhost for symfony projects deployment and the only thing the default PHP is missing is the support for APC (alternate php cache). So after looking at the dreamhost wiki I cleaned up and added some features to the one of the install scripts.\u2026","rel":"","context":"In &quot;Web Development&quot;","block_context":{"text":"Web Development","link":"https:\/\/www.opengis.ch\/de\/category\/web-development\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1726,"url":"https:\/\/www.opengis.ch\/de\/2015\/07\/29\/postgres-expression-compiler\/","url_meta":{"origin":17,"position":5},"title":"Postgres Expression Compiler for QGIS","author":"Matthias Kuhn","date":"29. Juli 2015","format":false,"excerpt":"Performance This project is all about performance of QGIS with a postgres\/postgis database. A lot of people have QGIS connected to postgres\/postgis (if you don't: it's a great combination in the open source geo stack). Databases are really optimized for querying. They keep indexes of geometries to be able to\u2026","rel":"","context":"In &quot;Uncategorised&quot;","block_context":{"text":"Uncategorised","link":"https:\/\/www.opengis.ch\/de\/category\/uncategorised\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_shortlink":"https:\/\/wp.me\/pbdBtI-h","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/posts\/17","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/comments?post=17"}],"version-history":[{"count":1,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/posts\/17\/revisions"}],"predecessor-version":[{"id":11242,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/posts\/17\/revisions\/11242"}],"wp:attachment":[{"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/media?parent=17"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/categories?post=17"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/tags?post=17"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}