Riepilogo post nella categoria Sviluppo Siti Web

In un'epoca in cui il mercato online è sempre più competitivo, l'efficienza e la scalabilità delle piattaforme e-commerce e delle web app aziendali diventano un fattore chiave per il successo.
Affidarsi a un programmatore siti e-commerce esperto significa andare oltre la semplice "presenza online": significa costruire strumenti strategici per la crescita.

Come specialista nello sviluppo ecommerce torino, porto l’esperienza di chi sa progettare, realizzare e ottimizzare piattaforme su misura, basate su tecnologie PHP evolute, pensate per gestire volumi importanti e processi complessi.

Costruzione piattaforme e-commerce da zero: il vero sviluppo custom

La realizzazione ecommerce torino che propongo parte da un presupposto fondamentale: ogni progetto è unico.

Non utilizzo pacchetti preconfezionati né CMS generalisti:
progetto piattaforme e-commerce da zero, basate sulle esigenze specifiche dell'azienda, garantendo:

  • Architettura dati ottimizzata
  • User experience personalizzata
  • Integrazione nativa con sistemi aziendali
  • Sicurezza avanzata

La realizzazione siti e commerce torino richiede un approccio sartoriale, che tenga conto delle peculiarità di ogni business: flussi B2C, logiche B2B, configurazioni multi-magazzino, listini personalizzati, sistemi di pagamento avanzati.

Un e-commerce ben costruito non è solo una vetrina: è il motore di crescita della tua azienda.

E se vuoi saperne di più su come posso costruire il tuo e-commerce da zero, trovi tutti i riferimenti nella mia pagina Contatti.

Integrazione gestionale, CRM, ERP: il cuore operativo dell’e-commerce moderno

Costruire un e-commerce oggi senza pensare all'integrazione gestionale significa prepararsi a problemi futuri.

Come programmatore specializzato nella creazione siti internet torino e nella realizzazione siti internet dinamici torino, progetto piattaforme che dialogano perfettamente con:

  • ERP aziendali
  • Sistemi CRM per la gestione clienti
  • Software di contabilità
  • Sistemi di marketing automation

Attraverso API sicure e sincronizzazioni intelligenti, garantisco che ogni ordine, ogni anagrafica, ogni flusso operativo sia perfettamente integrato tra il frontend e il cuore operativo dell'azienda.

Sviluppare un e-commerce significa costruire un ecosistema digitale, non solo una pagina di vendita.

Progetti B2B/B2C ad alta complessità: quando il "fai da te" non basta

Il vero sviluppo custom emerge quando si parla di:

  • Configuratori di prodotto avanzati
  • Flussi di approvazione B2B
  • Sistemi di scontistica complessa
  • Multi-store, multi-country, multi-currency
  • Gestione differenziata per clienti privati e aziende

In questi casi, affidarsi a chi si occupa semplicemente di "sviluppo web torino" non basta.
Serve esperienza reale nella gestione di progetti ad alta complessità, dove il codice diventa il tessuto connettivo tra business e tecnologia.

E se vuoi costruire un progetto ambizioso e strutturato, possiamo confrontarci direttamente: scrivimi.

Sviluppo in PHP: il linguaggio che garantisce flessibilità e scalabilità

Nel mio approccio allo sviluppo in php, PHP non è solo un linguaggio: è uno strumento estremamente potente, versatile, in grado di costruire soluzioni su misura che crescono con il business.

PHP permette:

  • Performance elevate
  • Sicurezza avanzata
  • Scalabilità orizzontale
  • Integrazioni rapide con sistemi esterni
  • Costo contenuto in termini di sviluppo e manutenzione

Ecco perché lo scelgo sistematicamente come base per la realizzazione ecommerce torino e per la realizzazione siti internet dinamici torino.

La chiave non è tanto la tecnologia in sé, ma come viene utilizzata da mani esperte.

Ottimizzazione performance e sicurezza: due pilastri imprescindibili

Una piattaforma lenta o insicura è una piattaforma destinata al fallimento.
Per questo, ogni progetto che sviluppo include:

  • Implementazione di cache avanzata (Redis, Varnish)
  • Minificazione e compressione automatica delle risorse
  • Strategie di page caching differenziate
  • Monitoraggio del traffico e degli errori in real-time
  • Sistemi di backup e disaster recovery integrati
  • Protezione anti-DDoS e WAF (Web Application Firewall)

Sia per progetti di e-commerce torino, sia per piattaforme di altro tipo, la sicurezza e le performance sono integrate nativamente nell'architettura.

Non si tratta di "aggiunte successive". Sono pilastri progettuali, pensati fin dall'inizio.

Sviluppo siti web Torino: non solo tecnica, ma strategia digitale

Come specialista nello sviluppo siti web torino, il mio approccio va oltre il puro sviluppo tecnico:

  • Analisi di mercato e dei competitor
  • Definizione degli obiettivi di business
  • Studio della user experience ideale
  • Scelta ponderata delle tecnologie più adatte

Ogni decisione tecnica ha un impatto strategico.
Ogni linea di codice scritta è un passo concreto verso il raggiungimento degli obiettivi aziendali.

Conclusione: la differenza la fa chi sa costruire su misura

In un mondo dominato da soluzioni rapide e standardizzate, affidarsi a un programmatore siti e-commerce capace di:

  • Progettare infrastrutture su misura
  • Integrare piattaforme complesse
  • Ottimizzare sicurezza e performance
  • Accompagnare la crescita dell'azienda

è un vantaggio competitivo reale.

Sono a tua disposizione per aiutarti a costruire un e-commerce o una web app che non sia solo un sito, ma una leva strategica per la tua crescita. Contattami ora e iniziamo insieme a progettare il futuro della tua azienda.

Ultima modifica: Giovedì 6 Marzo 2025, alle 14:10

In un mercato digitale sempre più competitivo e normativamente esigente, affidarsi a un semplice sviluppatore non basta più.
Servono visione strategica, capacità di analisi profonda, competenze di alto livello.

Come consulente informatico torino, il mio ruolo va ben oltre la semplice implementazione tecnica: affianco le aziende nelle scelte tecnologiche, nella protezione delle infrastrutture e nello sviluppo di soluzioni realmente personalizzate.

Analisi infrastrutturale e code audit: il primo passo verso la solidità

Ogni progetto che seguo inizia da un'analisi infrastrutturale approfondita.

Questo significa:

  • Mappatura delle risorse esistenti (server, database, applicazioni)
  • Verifica delle vulnerabilità e delle esposizioni
  • Code audit dei software customizzati

Spesso le PMI sottovalutano l'importanza di questa fase.
Eppure, individuare in anticipo criticità come:

  • Codice non sicuro
  • Database MySQL sovraccarichi
  • Architetture monolitiche obsolete

può fare la differenza tra una crescita solida e un fallimento annunciato.

Come freelance mysql e esperto consulente in sicurezza informatica, analizzo anche la struttura e la configurazione dei database, per garantire:

  • Ottimizzazione delle query
  • Indici corretti
  • Protezione contro injection e attacchi DDoS

E se vuoi sapere come approccio la fase di analisi tecnica e strategica, trovi maggiori informazioni nella mia pagina Chi Sono.

Scelta del miglior stack tecnologico: PHP custom come valore aggiunto

Un errore frequente che vedo commettere è affidarsi a soluzioni standardizzate, pensate per esigenze generiche.
Ma ogni azienda è diversa.

Come consulente informatico torino, guido i clienti nella scelta consapevole del miglior stack tecnologico possibile, spesso orientato allo sviluppo siti internet php e alla realizzazione siti web php custom.

Questo approccio consente di:

  • Creare piattaforme su misura
  • Integrare sistemi esterni in modo nativo
  • Gestire flussi complessi senza forzature

Il sviluppo PHP custom che propongo non è mai fine a se stesso.
È uno strumento per aumentare l'efficienza operativa e migliorare la scalabilità.

La realizzazione siti custom php milano e la creazione siti web personalizzati torino sono processi che richiedono:

  • Analisi precisa dei requisiti
  • Architettura modulare
  • Codice sicuro e manutenibile

E se vuoi capire come scegliere tra diverse tecnologie PHP-based, possiamo parlarne direttamente.

Sicurezza applicativa e conformità GDPR/NIS2: una priorità imprescindibile

Oggi non è più accettabile mettere online un'applicazione senza averla blindata contro rischi di sicurezza.

Come esperto consulente in sicurezza informatica, curo ogni aspetto legato alla protezione applicativa:

  • Implementazione di autenticazioni sicure (OAuth2, JWT)
  • Protezione contro SQL Injection, XSS, CSRF
  • Gestione crittografata delle credenziali e dei dati sensibili
  • Log management per la rilevazione degli incidenti

Ma la sicurezza non si esaurisce nella parte tecnica.
Va integrata nella conformità normativa.

Con l'entrata in vigore del GDPR e ora della direttiva NIS2, le imprese devono:

  • Gestire correttamente il trattamento dei dati personali
  • Implementare misure tecniche adeguate al rischio
  • Dimostrare la resilienza delle proprie infrastrutture

Non basta più "fare attenzione": serve progettare la sicurezza.

E se vuoi approfondire come portare la tua piattaforma alla piena compliance GDPR/NIS2, scrivimi senza impegno.

La sicurezza informatica non è un costo, ma un investimento strategico.

Riguardo la Compliance NIS2, ho redatto una campagna divulgativa molto dettagliata nominata NIS2 Awareness - Dettagli tecnico/operativi sulla Direttiva UE 2022/2555. Dedica un pò del tuo tempo a prendere consapevolezza sull'argomento: è vitale per il tuo business, anche se la tua azienda non dovesse rientrare nel campo d'applicazione normativo.

Supporto strategico continuo per PMI: dalla crescita all'evoluzione

Un consulente IT efficace non si limita alla fase di sviluppo o di audit iniziale.
Costruisce un rapporto di supporto strategico continuo.

Il mio approccio come consulente ecommerce torino e come consulente informatico freelance prevede:

  • Roadmap evolutive per la crescita digitale
  • Evolutive periodiche su piattaforme custom
  • Monitoraggio costante delle performance
  • Aggiornamenti di sicurezza proattivi
  • Affiancamento decisionale su nuove tecnologie o integrazioni

Sviluppare siti web è solo una parte del lavoro.
Il vero valore emerge nel saper accompagnare l'azienda nel tempo, adattando l'infrastruttura ai cambiamenti del mercato.

E puoi scoprire come strutturo il supporto strategico nella mia pagina di presentazione.

Esperti PHP e sviluppo web personalizzato: la differenza nella qualità

L'esperienza PHP fa la differenza tra un progetto che resiste al tempo e uno che si sgretola sotto i primi carichi.

Come esperti php, portiamo in ogni progetto:

  • Codifica orientata alla sicurezza
  • Ottimizzazione delle performance
  • Adozione di standard di sviluppo (PSR, SOLID, Clean Code)
  • Scalabilità progettuale

Quando parliamo di realizzazione siti web php o di sviluppo siti internet php, non ci riferiamo a semplici vetrine online, ma a piattaforme di business mission-critical.

Progetti che devono:

  • Reggere picchi di traffico
  • Integrare gestionali o ERP
  • Supportare logiche complesse di business

E tutto questo, senza mai perdere di vista l'aspetto della sicurezza e della manutenibilità a lungo termine.

Conclusione: non limitarti a "realizzare un sito", investi in una strategia IT vincente

Se cerchi solo qualcuno che ti "faccia un sito", troverai centinaia di soluzioni online.
Se invece cerchi un consulente informatico torino capace di:

  • Analizzare criticamente la tua infrastruttura
  • Costruire una strategia digitale su misura
  • Sviluppare piattaforme robuste, sicure e scalabili
  • Affiancarti nella crescita tecnologica della tua azienda

allora stiamo già parlando la stessa lingua.

Sono a tua disposizione per discutere senza impegno il tuo progetto, identificare insieme le criticità e costruire una roadmap di crescita solida. Contattami ora e iniziamo a lavorare insieme.

Ultima modifica: Mercoledì 5 Marzo 2025, alle 14:10

Nel panorama digitale attuale, l'esigenza di soluzioni software su misura è sempre più sentita dalle piccole e medie imprese italiane.
Standardizzare non basta più: serve personalizzazione, sicurezza, scalabilità.
Ed è qui che entra in gioco il ruolo di un programmatore PHP senior freelance, specializzato nello sviluppo custom.

Come programmatore PHP torinese, con oltre vent'anni di esperienza diretta sul campo, mi dedico allo sviluppo PHP su misura per aziende che non possono accontentarsi di piattaforme prefabbricate o soluzioni generiche.

Codice PHP tailor-made per PMI: perché è essenziale

Sviluppare un'applicazione customizzata significa partire da un'analisi profonda delle esigenze aziendali.
Ogni business ha processi propri, logiche interne specifiche, flussi operativi che richiedono strumenti adattabili e sicuri.

Uno sviluppatore PHP senior ha la capacità di:

  • Modellare il codice sulla base delle reali necessità operative
  • Evitare bloatware e codice ridondante tipico delle soluzioni preconfezionate
  • Integrare nativamente strumenti terzi senza forzature
  • Costruire un'architettura solida, pronta a scalare nel tempo

Come php developer freelance, affronto ogni progetto con questo approccio: progettare e realizzare codice PHP perfettamente aderente alle esigenze dell'azienda cliente.

Ogni riga di codice scritta su misura è un investimento nella crescita e nell'efficienza del tuo business.

Il refactoring del codice legacy: una sfida imprescindibile

Molte PMI italiane si trovano oggi a gestire sistemi web obsoleti, sviluppati anni fa, spesso senza documentazione, senza test, senza criteri moderni di sicurezza.

In questi casi, il compito di un programmatore PHP senior non è solo sviluppare nuove funzionalità, ma anche:

  • Analizzare il codice esistente (audit)
  • Mappare vulnerabilità e debolezze architetturali
  • Pianificare un refactoring progressivo, minimizzando i rischi
  • Garantire la business continuity durante le fasi di migrazione

Refactoring non significa "buttare tutto e rifare".
Significa valorizzare l'esistente, portandolo ai moderni standard di sicurezza e performance.

Come php freelancer italy, ho seguito numerosi progetti di refactoring critico, sempre partendo da una mappatura dettagliata del codice legacy esistente.

E se stai valutando il refactoring della tua piattaforma, possiamo parlarne qui, senza impegno.

Sviluppo di soluzioni scalabili e sicure

Una delle domande più frequenti che mi viene posta come freelance php programmer riguarda la scalabilità:
"Questo sistema reggerà se i miei utenti raddoppieranno? O triplicheranno?"

La risposta non è mai scontata.
Dipende da:

  • Come è progettata l'architettura dati
  • Come è gestita la persistenza e la cache
  • Quali strategie di load balancing e scaling sono predisposte

Nel mio approccio allo sviluppo web PHP, la scalabilità è pensata sin dall'inizio:

  • Utilizzo di ORM performanti o query SQL ottimizzate
  • Cache su Redis o Memcached per ridurre il carico sul database
  • Session handling sicuro e decentralizzato
  • Load balancing intelligente tra server web
  • Deployment tramite CI/CD con rollback automatizzato

Senza dimenticare, naturalmente, il tema della sicurezza:

Il 100% delle applicazioni che sviluppo è hardenizzato contro SQL Injection, XSS, CSRF e altre vulnerabilità OWASP Top 10.

Affidandoti a un programmatore PHP freelance serio ed esperto, avrai la certezza di costruire non solo una web app, ma una piattaforma resiliente.

Partnership tecnica a lungo termine

Un'applicazione web non finisce con il rilascio in produzione.
Anzi, inizia proprio da lì il suo ciclo di vita evolutivo.

Come programmatore PHP freelance torino, offro alle aziende un modello di partnership tecnica a lungo termine:

  • Manutenzione evolutiva e correttiva
  • Refactoring incrementale
  • Aggiornamenti di sicurezza
  • Evolutive funzionali sulla base delle esigenze del business

Non si tratta di un rapporto mordi-e-fuggi, ma di accompagnare il cliente nel suo percorso di crescita digitale.

Sono convinto che la longevità di una collaborazione si basi sulla fiducia, sulla trasparenza e sulla qualità costante del servizio.

Se cerchi non solo un programmatore, ma un partner tecnologico, possiamo iniziare a parlarne.

Il vantaggio competitivo di lavorare con un PHP Freelancer Italy

Essere php freelancer italy significa:

  • Massima flessibilità nella gestione dei progetti
  • Tempi di risposta rapidi
  • Relazione diretta senza intermediari
  • Adattabilità a esigenze specifiche e mutevoli
  • Esperienza maturata su progetti di settori diversi

Ogni progetto è unico.
Ogni esigenza è diversa.
Solo un php developer freelance può davvero garantire quella customizzazione reale che spesso le agenzie, ingessate dai loro processi interni, non possono offrire.

Se la tua azienda ha bisogno di:

  • Un programmatore PHP senior che sappia costruire o rifattorizzare piattaforme complesse
  • Uno sviluppatore PHP capace di integrare sistemi eterogenei
  • Un consulente che parli la lingua del business, oltre a quella del codice

allora hai trovato il profilo giusto.

E puoi verificarlo tu stesso nella mia pagina Chi Sono.

Sviluppo PHP: molto più che "programmare"

Parlare di sviluppo PHP oggi non significa semplicemente "scrivere codice".
Significa:

  • Saper progettare architetture sicure e scalabili
  • Saper integrare API e microservizi
  • Saper gestire la compliance normativa (GDPR, NIS2)
  • Saper ottimizzare performance lato server e client

Nel mio lavoro quotidiano di sviluppatore PHP, questi aspetti sono parte integrante del processo.

Ogni progetto inizia sempre da un'analisi dettagliata:

  • Comprendere il contesto aziendale
  • Definire requisiti funzionali e non funzionali
  • Identificare criticità potenziali
  • Disegnare un'architettura di sistema robusta

Solo dopo si passa alla fase di sviluppo vera e propria.

Un approccio senior, consapevole, strutturato.

E se stai cercando una figura tecnica che vada oltre il mero coding, possiamo parlarne qui.

Focus Torino: perché scegliere un programmatore PHP torinese

Torino è un hub tecnologico in forte crescita.
Scegliere un programmatore PHP torino significa avere:

  • Vicinanza geografica per meeting operativi
  • Conoscenza del tessuto imprenditoriale locale
  • Flessibilità per eventuali esigenze onsite
  • Network di collaborazione con altre figure IT senior (designer UX, DevOps, data engineer)

Collaborare con un professionista radicato nel territorio, ma con visione internazionale, è un valore aggiunto reale.

E se operi su Torino o Piemonte, possiamo anche organizzare un incontro conoscitivo di persona.

I vantaggi concreti di affidarsi a un programmatore PHP freelance senior

Riassumendo, scegliere un freelance php programmer esperto comporta:

  • Codice su misura per la tua realtà
  • Sicurezza come pilastro centrale del progetto
  • Scalabilità pensata sin dall'analisi iniziale
  • Assistenza tecnica continua nel tempo
  • Approccio consulenziale, non meramente esecutivo

Un mix di competenze che può fare la differenza tra un progetto che resta fermo al palo e uno che evolve con il tuo business.

Conclusione: costruire oggi il successo di domani

In un mondo digitale sempre più competitivo e vulnerabile, scegliere il giusto programmatore PHP freelance è una decisione strategica.

Non si tratta solo di risparmiare sui costi di agenzia.
Si tratta di:

  • Costruire infrastrutture solide
  • Proteggere i dati e le informazioni critiche
  • Sostenere la crescita con soluzioni scalabili
  • Avere un partner tecnico sempre disponibile

Se vuoi investire nella qualità del tuo progetto, se cerchi un programmatore PHP senior freelance a Torino che parli la lingua della sicurezza, della scalabilità e della consulenza tecnica evoluta, allora siamo allineati.

Sono a tua disposizione per approfondire il tuo progetto e costruire insieme la tua prossima piattaforma di successo. Contattami ora.

Ultima modifica: Lunedì 3 Marzo 2025, alle 14:00

Dal 1995, data della sua prima introduzione, ad oggi, il linguaggio PHP ha visto una crescente adozione globale ed è stato utilizzato per creare una vasta gamma di applicazioni web, dal semplice blog personale alle più complesse soluzioni per imprese. Si tratta di un linguaggio di programmazione che, oltre alla sua versione “di base”, prevede anche numerosi framework PHP, ovvero dei sistemi che consentono di estendere le funzionalità del linguaggio di programmazione su cui è basato, fornendo allo sviluppatore una struttura coerente ed efficace che semplifica lo sviluppo di applicazioni web complesse, di cui, tra i più popolari, WordPress, Laravel, CodeIgniter, Magento, PrestaShop e WooCommerce.

Qualche statistica su PHP e sui Framework più popolari che utilizzano PHP.

Secondo le statistiche del sito web W3Techs, PHP è utilizzato come linguaggio di programmazione su poco meno dell’80% dei siti web dinamici attivi su Internet. Ciò fa di PHP uno dei linguaggi di programmazione web più utilizzati al mondo e la sua adozione continua a crescere.

WordPress: il CMS più usato al mondo.

Chi non conosce WordPress, sistema di gestione dei contenuti (CMS - Content Management System) che viene utilizzato per creare siti web e blog, anch’esso basato su PHP? Le stesse statistiche citate sopra ci dicono che è alla base di circa il 40% dei siti web dinamici attivi su Internet, il che lo rende il CMS più popolare al mondo. WordPress è gratuito e open source, il che significa che gli sviluppatori possono utilizzarlo liberamente e personalizzarlo secondo le esigenze. WordPress, inoltre, ha migliaia di plugin e temi disponibili che permettono agli sviluppatori di estendere le funzionalità in modo semplice ed efficace.

Laravel: moderno, robusto e facile da usare.

Più recente, e meno noto agli hobbyisti di Internet, è Laravel, un framework PHP moderno e robusto, introdotto nel 2011. È stato progettato per semplificare lo sviluppo di applicazioni web complesse e offre funzionalità come il routing, l'ORM, la gestione delle sessioni, la crittografia e la gestione della cache. Laravel è anche noto per la sua documentazione chiara e dettagliata, che lo rende facile da imparare e utilizzare, tanto che nel 2015 si è guadagnato il riconoscimento di SitePoint come migliore framework PHP.

Consiglio: se hai in mente un progetto Cloud-Based, o se hai già una applicazione basata su Laravel, e hai bisogno di un Senior PHP Backend Engineer, contattami senza impegno.

CodeIgniter: veloce e sicuro.

Nel 2006 è stato introdotto anche CodeIgniter. Si tratta di un framework PHP leggero e veloce che è stato progettato per essere facile da imparare e utilizzare. Offre funzionalità come la gestione dei modelli, il routing, la validazione dei form e la gestione delle sessioni. È anche molto affidabile grazie alle sue capacità di crittografia e decrittografia. Dispone di filtro XSS, della gestione delle password e della convalida dei dati di input, che lo rendono molto efficace nella protezione delle applicazioni web.

Consiglio: non basare il tuo progetto su Code Igniter: il framework Laravel è decisamente superiore

Magento: funzionalità avanzate per l’e-commerce.

Per la gestione dei cataloghi, degli ordini, dei pagamenti e delle spedizioni dei siti e-commerce Magento è un framework PHP molto efficiente e dalle funzionalità avanzate. È stato rilasciato definitivamente nel 2008 e, secondo BuiltWith, Magento è utilizzato su oltre il 7% dei siti web di e-commerce attivi su Internet.

PrestaShop: semplice e completamente personalizzabile.

Anche PrestaShop è un framework PHP utilizzato per creare siti web di e-commerce. Introdotto nel 2007, anch’esso offre funzionalità come la gestione del catalogo, la gestione degli ordini, la gestione dei pagamenti e la gestione delle spedizioni. Ma la sua caratteristica più apprezzata è la facilità con cui si può personalizzare completamente. Secondo le statistiche di BuiltWith, PrestaShop è utilizzato su oltre l'1% dei siti web di e-commerce attivi su Internet.

WooCommerce: l’ecommerce per WordPress.

Si tratta di un plugin per WordPress che permette agli utenti di creare un sito web di e-commerce. WooCommerce offre funzionalità come la gestione del catalogo, la gestione degli ordini, la gestione dei pagamenti e la gestione delle spedizioni, appoggiandosi direttamente al CMS WordPress il che lo rende, secondo i dati di WebTribunal, aggiornati a marzo 2023, il framework PHP per l’e-commerce più utilizzato, su oltre il 28% dei siti web di e-commerce attivi su Internet.

Perchè PHP è così popolare?

La ragione principale della popolarità di PHP è duplice: è un linguaggio di programmazione open source con una grossa community, e sul mercato sono presenti numerose soluzioni che rendono possibile lo sviluppo e messa online di siti web, come quelle sommarizzate in questo articolo, soluzioni che sono tutte egualmente valide, affermate, e con una grossa community di sviluppatori alle spalle. Inoltre, il fatto che sia un linguaggio open source ha fatto sì che il supporto a questo linguaggio su ambienti server Linux sia pressochè onnipresente su tutte le distribuzioni e architetture.

La comunità open source di sviluppatori PHP è molto attiva e utilizza lo strumento Composer per gestire le parti che restano in comunque, come le dipendenze delle librerie di terze parti. Composer semplifica la gestione delle dipendenze e consente agli sviluppatori di integrare facilmente librerie esterne nei loro progetti. Questo ha contribuito ad arricchire il sistema e a creare un ecosistema solido di librerie PHP open source, tra cui framework, librerie per l'accesso ai database, librerie per l'autenticazione, librerie per l'elaborazione di immagini e molto altro ancora.

Grazie alla sua facilità d’uso, alla vasta gamma di funzionalità offerte e alla sua scalabilità PHP è stato ampiamente adottato dalla grande comunità di sviluppatori ed è diventato uno dei linguaggi di programmazione web più affidabili e robusti disponibili. Inoltre, poiché è stato utilizzato per così tanto tempo, ci sono molte risorse online disponibili per gli sviluppatori che iniziano a lavorare con PHP o utili anche ai più esperti per risolvere problemi specifici.

Queste sue caratteristiche hanno fatto sì che PHP sia stato utilizzato anche per sviluppare applicazioni web di successo, come Facebook, Wikipedia, Yahoo e WordPress e che, grazie alla grande attività della comunità degli sviluppatori, si siano sviluppati i framework che abbiamo visto sopra e anche numerosi pacchetti open source per essi.

PHP verrà mai dismesso o diventerà obsoleto?

Molti esperti di tecnologia credono che PHP sia un linguaggio di programmazione che non verrà mai dismesso, nonostante l'introduzione di nuovi linguaggi di programmazione web come Python e JavaScript. Vediamo sulla base di quali motivazioni.

In primo luogo, PHP è molto utilizzato, anche da grossi portali e social network. Il fatto che sia in uso da così tanto tempo, ha fatto sì che sia stato testato a fondo e i problemi noti sono stati risolti da tempo. Inoltre, la grande community di sviluppatori continua ad ampliare e migliorare il linguaggio in modo da affrontare e risolvere velocemente anche nuove problematiche.

In secondo luogo, PHP è supportato su qualsiasi sistema operativo. Nativamente, PHP è progettato per funzionare su ambienti Linux, ma sono disponibili delle build per qualsiasi tipo di sistema operativo o device.

Infine, PHP è molto flessibile. Ci sono molte librerie e strumenti disponibili che permettono agli sviluppatori di creare una vasta gamma di applicazioni web, dalle più semplici alle più complesse. Inoltre è supportato da molti provider di hosting web, il che lo rende facile da utilizzare per creare applicazioni web. Senza dimenticare che, come abbiamo visto in precedenza, le applicazioni e le piattaforme più diffuse sul web, come Facebook e WordPress, sono basate proprio sul linguaggio PHP cosa che lo rende praticamente insostituibile.

Se pensi di avere bisogno di un Senior PHP Backend Engineer per gestire i tuoi server, modificare o ampliare i tuoi progetti, contattami senza impegno.

Ultima modifica: Mercoledì 10 Mag 2023, alle 16:45
Aggiornamento 05/09/2023: è disponibile la nuova guida aggiornata Configurazione di uno Stack LAMP su Windows 11 (e Windows 10), con WSL2, Ubuntu 22.04, servizi systemd nativi e ottimizzazioni per lo sviluppo con VS Code. Si consiglia vivamente di fare riferimento alla nuova guida.

Nota: questa guida creata da Maurizio Fonte è anche disponibile come GIST su GitHub all'indirizzo https://gist.github.com/mauriziofonte/00002661cd527a8a457509c5b4b0613d.

Lo sviluppo web con tecnologie puramente Linux (Stack LAMP - Linux, Apache, Mysql, PHP) è diventato estremamente semplice su Windows 10.

Infatti, con WSL è possibile, citando la pagina ufficiale di Microsoft: Sottosistema Windows per Linux consente agli sviluppatori di eseguire un ambiente GNU/Linux, inclusi la maggior parte degli strumenti da riga di comando, delle utilità e delle applicazioni, direttamente in Windows, senza modifiche e senza il sovraccarico di una macchina virtuale tradizionale o di una configurazione di avvio doppio.

Inoltre, sempre Microsoft è riuscita a creare uno degli editor di codice più potenti e completi in circolazione: Visual Studio Code. Una volta iniziato ad utilizzare, sarà molto molto difficile tornare indietro.

E' importante quindi conoscere come configurare un ambiente di sviluppo confortevole, che permetta di dire addio al vecchio modus operandi inefficiente e macchinoso che obbligava l'uso di WinSCP e Notepad++ con modifiche pubblicate direttamente sui server di produzione (o altri sistemi similari).

Con lo stack LAMP su Windows e l'utilizzo di Visual Studio Code e la continuous integration di Git, sarà possibile essere più produttivi e testare le condizioni reali di produzione direttamente sul proprio PC.

Nel corso del tempo, ho creato una guida esaustiva che spiega come configurare un ambiente di sviluppo comodo con stack LAMP utilizzando WSL2 su Windows. E' una lettura lunga, si consiglia di leggerla con calma, cercando di comprendere ogni passaggio, ed eventualmente adattarla ai propri scopi. Questa guida è anche disponibile a questo indirizzo, per una più comoda lettura: https://gist.github.com/mauriziofonte/00002661cd527a8a457509c5b4b0613d

Importante: come precondizione per un buon uso di questa guida, è necessaria una conoscenza minima del terminale di Linux e una buona dimestichezza con Windows.

Attenzione: questa guida è stata scritta per Windows 10. Tuttavia, potrebbe funzionare su Windows 11, ma non ho avuto modo di testarla dal vivo. Su Windows 11, quindi, seguire una guida specifica per l'abilitazione di WSL2, e tralasciare la parte WSL2 presente in questa guida.

Stack di sviluppo LAMP su Windows 10 con WSL2 e Visual Studio Code

Questa guida illustrerà come installare il supporto al sottosistema Linux nativo di Windows (WSL2), creare uno stack LAMP al suo interno, e agganciare Visual Studio Code per lo sviluppo direttamente su filesystem Linux.

La guida è aggiornata ad Agosto 2022 e necessita di questi prerequisiti:

  1. Computer con Windows 10, aggiornato all'ultima release disponibile
  2. 16GB di RAM
  3. 30GB di spazio libero su C: (conterrà il disco virtuale di Ubuntu)
  4. Un SSD (meglio NVMe) come disco di avvio di Windows (migliori performance con Mysql)
  5. Una conoscenza di base del terminale Linux (cd, cp, mv, sudo, nano, etc.)

Lo stack LAMP che andremo a configurare supporta https (con certificati autofirmati con scadenza a 10 anni), protocollo http/2 e compressione brotli. Per quanto riguarda la parte PHP, useremo PHP-FPM perchè è più performante e più versatile nella configurazione delle impostazioni per-virtualhost. Per capire le differenze tra l'utilizzo di PHP con Apache in modalità PHP-CGI piuttosto che PHP-FPM, si rimanda a questa guida: https://www.basezap.com/difference-php-cgi-php-fpm/

Installare Ubuntu 20.04 LTS su Windows

  1. Leggere il warning sotto (La versione di WSL deve essere la 2).
  2. Abilitare "Sottosistema Linux" da "Programmi e funzionalità"
  3. Cercare "Ubuntu" nel Windows Store e installare UBUNTU 20.04 LTS
  4. Avviare la macchina, attendere l'installazione, scegliere un nome utente (occhio, serve sotto ed è importante) composto da una singola parola corta tutta in minuscolo + la relativa password (corta, 1 sola lettera per comodità)
  5. Creare un collegamento desktop alla macchina Linux
  6. Creare un collegamento desktop alla directory home dell'utente, esempio: \\wsl$\Ubuntu-20.04\home\maurizio

WARNING: la versione di WSL DEVE essere la 2

Questo è molto importante. Se non è installato WSL2, non funziona nulla.

Per questo motivo, leggere https://aka.ms/wsl2-install. SI CONSIGLIA DI FARE QUESTA OPERAZIONE PRIMA DI INSTALLARE UBUNTU SUL SISTEMA.

Se necessario abilitare WSL2 (perchè non già abilitato), bisognerà aprire una PowerShell con privilegi elevati e usare questi comandi:

Installare questo pacchetto: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
Restart-Computer                    # bisogna riavviare
wsl --set-version Ubuntu-20.04 2    # IMPORTANTE: questo è necessario solo se si è installato ubuntu prima di abilitare WSL2
wsl --set-default-version 2

Modificare il resolver DNS di WSL2

Guida copiata da: https://superuser.com/questions/1533291/how-do-i-change-the-dns-settings-for-wsl2

A) Turn off generation of /etc/resolv.conf

Using your Linux prompt, (I'm using Ubuntu), modify (or create) /etc/wsl.conf with the following content

[network]
generateResolvConf = false

(Apparently there's a bug in the current release where any trailing whitespace on these lines will trip things up.)

B) Restart the WSL2 Virtual Machine

Exit all of your Linux prompts and run the following Powershell command

wsl --shutdown

C) Create a custom /etc/resolv.conf

Open a new Linux prompt and cd to /etc

If resolv.conf is soft linked to another file, remove the link with rm resolv.conf (originally it is linked to ../run/resolvconf/resolv.conf)

Create a new resolv.conf with the following content

nameserver 1.1.1.1

Configurare l'ambiente LAMP su Ubuntu - Step 1

Qui andremo ad installare tutti i pacchetti di PHP in tutte le versioni dalla 5.6 alla 8.1, nonchè il web server Apache e il server Mysql.

Perchè installare tante versioni di PHP? Perchè è importante avere a disposizione un ambiente di sviluppo che consenta, con facilità, di testare la propria applicazione con svariate versioni di PHP. Questo agevolerà il lavoro in caso di constraint specifici sui server di produzione dove andremo ad installare le applicazioni create.

Si presume che la versione di default di PHP che si vorrà utilizzare nel sistema sia la 8.1. Questo è modificabile tramite le righe update-alternatives --set php*** che si troveranno nella lista qui sotto. Ad esempio, se si desidera che la versione di PHP di default (quella che verrà utilizzata digitando semplicemente il comando php e non la sua versione "versionata" es php7.4) basterà specificare update-alternatives --set php /usr/bin/php7.4.

IMPORTANTE: Lanciare tutti questi comando come l'utente root. IMPORTANTE: Escludere le linee che iniziano con ### in quanto servono solo a differenziare i vari blocchi.

# APT UPGRADE & INSTALL OF PHP + APACHE
apt update && apt upgrade
apt install net-tools unzip git lsb-release ca-certificates apt-transport-https software-properties-common -y
add-apt-repository ppa:ondrej/php
add-apt-repository ppa:ondrej/apache2
apt install openssl apache2 brotli libapache2-mod-fcgid libapache2-mod-php8.1 php8.1 php8.1-cli php8.1-fpm php8.1-common php8.1-bcmath php8.1-bz2 php8.1-curl php8.1-gd php8.1-intl php8.1-mbstring php8.1-mcrypt php8.1-mysql php8.1-xml php8.1-zip libapache2-mod-php8.0 php8.0 php8.0-cli php8.0-fpm php8.0-common php8.0-bcmath php8.0-bz2 php8.0-curl php8.0-gd php8.0-intl php8.0-mbstring php8.0-mcrypt php8.0-mysql php8.0-xml php8.0-zip libapache2-mod-php7.4 php7.4 php7.4-cli php7.4-fpm php7.4-common php7.4-bcmath php7.4-bz2 php7.4-curl php7.4-gd php7.4-intl php7.4-json php7.4-mbstring php7.4-mcrypt php7.4-mysql php7.4-xml php7.4-zip libapache2-mod-php7.3 php7.3 php7.3-cli php7.3-fpm php7.3-common php7.3-bcmath php7.3-bz2 php7.3-curl php7.3-gd php7.3-intl php7.3-json php7.3-mbstring php7.3-mcrypt php7.3-mysql php7.3-xml php7.3-zip libapache2-mod-php7.2 php7.2 php7.2-cli php7.2-fpm php7.2-common php7.2-bcmath php7.2-bz2 php7.2-curl php7.2-gd php7.2-intl php7.2-json php7.2-mbstring php7.2-mcrypt php7.2-mysql php7.2-xml php7.2-zip libapache2-mod-php7.1 php7.1 php7.1-cli php7.1-fpm php7.1-common php7.1-bcmath php7.1-bz2 php7.1-curl php7.1-gd php7.1-intl php7.1-json php7.1-mbstring php7.1-mcrypt php7.1-mysql php7.1-xml php7.1-zip libapache2-mod-php7.0 php7.0 php7.0-cli php7.0-fpm php7.0-common php7.0-bcmath php7.0-bz2 php7.0-curl php7.0-gd php7.0-intl php7.0-json php7.0-mbstring php7.0-mcrypt php7.0-mysql php7.0-xml php7.0-zip libapache2-mod-php5.6 php5.6 php5.6-cli php5.6-fpm php5.6-common php5.6-bcmath php5.6-bz2 php5.6-curl php5.6-gd php5.6-intl php5.6-json php5.6-mbstring php5.6-mcrypt php5.6-mysql php5.6-xml php5.6-zip
update-alternatives --set php /usr/bin/php8.1
update-alternatives --set phar /usr/bin/phar8.1
update-alternatives --set phar.phar /usr/bin/phar.phar8.1
update-alternatives --set phpize /usr/bin/phpize8.1
update-alternatives --set php-config /usr/bin/php-config8.1
### OPTIONAL SQLITE3 SUPPORT
apt install php5.6-sqlite3 php7.0-sqlite3 php7.1-sqlite3 php7.2-sqlite3 php7.3-sqlite3 php7.4-sqlite3 php8.0-sqlite3 php8.1-sqlite3
### OPTIONAL REDIS SUPPORT
sudo apt install redis-server php5.6-redis php7.0-redis php7.1-redis php7.2-redis php7.3-redis php7.4-redis php8.0-redis php8.1-redis
# APACHE HTTP2 + PHP-FPM + SSL + REWRITE + BROTLI
a2dismod php5.6 php7.0 php7.1 php7.2 php7.3 php7.4 php8.0 php8.1 mpm_prefork
a2enconf php5.6-fpm php7.0-fpm php7.1-fpm php7.2-fpm php7.3-fpm php7.4-fpm php8.0-fpm php8.1-fpm
a2enmod actions fcgid alias proxy_fcgi rewrite ssl http2 mpm_event brotli
# INSTALL MYSQL
apt install mysql-client-8.0 mysql-server-8.0

Configurare l'ambiente LAMP su Ubuntu - Step 2

Qui andremo a modificare le configurazioni di base di Apache e Mysql per poter lavorare localmente.

  1. Aprire il file /etc/apache2/envvars con nano e modificare APACHE_RUN_USER e APACHE_RUN_GROUP settandoli, al posto che www-data, con il proprio nome utente
  2. Aprire il file /etc/apache2/ports.conf con nano e modificare ogni occorrenza di Listen con Listen 127.0.0.1 (esempio: 127.0.0.1:80 127.0.0.1:443)
  3. Lanciare service apache2 restart per applicare le modifiche alla config di Apache.
  4. Aprire il file /etc/mysql/mysql.conf.d/mysqld.cnf e aggiungere queste righe (sostituisci [LF] con delle andate a capo) nella sezione [mysqld], (per intenderci, sotto la riga # datadir = /var/lib/mysql) : bind-address = 127.0.0.1 [LF] skip-networking [LF] sql_mode=NO_ENGINE_SUBSTITUTION [LF] default-authentication-plugin=mysql_native_password [LF] collation-server = utf8_unicode_ci [LF] character-set-server = utf8
  5. (opzionale) Per completezza, al fondo di questo file è presente una configurazione di fine-tuning per un sistema con almeno 16GB di RAM. Volendo, si può direttamente copia-incollare quella configurazione.
  6. Lanciare service mysql restart per applicare le modifiche alla config di Mysql.
  7. Lanciare mysql_secure_installation per creare la password di root per mysql (usare qualcosa di semplice, perchè serve solo localmente), rimuovere l'accesso per gli utenti anonimi, le tabelle temporanee, e disabilitare il login remoto al demone Mysql.
  8. Eseguire mysql -u root e lanciare i comandi di seguito:
  9. CREATE USER 'admin'@'%' IDENTIFIED BY 'x';
  10. GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
  11. FLUSH PRIVILEGES;

Ovviamente, le query mysql relative allo username e password da creare come utente privilegiato possono essere modificate. Nell'esempio sopra riportato viene creato un utente con username admin e password x. Ricordarsi che stiamo configurando un ambiente di sviluppo locale, e fintanto che non viene "aperto" al mondo esterno, non dobbiamo preoccuparci di usare politiche corrette per la sicurezza.

Creare dei VirtualHost funzionanti sulla propria installazione locale - Step 3

Per creare dei VirtualHost è sufficiente utilizzare questi due script che velocizzano la configurazione.

Come fase esemplificativa, verrà mostrato come creare un VirtualHost specifico per PhpMyAdmin, che comunque è necessario per poter lavorare.

A questo punto, se ancora loggati come l'utente root, uscire dall'utente root e tornare in modalità utente.

sudo mkdir /etc/apache2/certs2/
cd ~/
mkdir utils
cd utils/
nano create-staging-environment.php (copiare da sotto il contenuto del file)
nano create-ssl-cert.sh (copiare da sotto il contenuto del file)
chmod +x create-ssl-cert.sh
cd ~/
nano lamp.sh (copiare da sotto il contenuto del file)
chmod +x lamp.sh
wget https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.zip
unzip phpMyAdmin-5.1.1-all-languages.zip
rm -f phpMyAdmin-5.1.1-all-languages.zip
mv phpMyAdmin-5.1.1-all-languages phpmyadmin

Ora abbiamo creato la directory radice per l'installazione di phpmyadmin. Non resta che configurare un VirtualHost funzionante.

Lanciare quindi il comando sudo php create-staging-environment.php e seguire le istruzioni. Queste istruzioni si applicano a tutti i progetti web che si vogliono installare sul sistema.

Nell'esempio, il virtualhost per PhpMyAdmin verrà settato come local.phpmyadmin.biz. Ovviamente, modificare le risposte seguendo il proprio nome utente. Rispondere alle domande dello script come segue:

maurizio@FISSO:~$ cd ~/utils/
maurizio@FISSO:~/utils$ sudo php create-staging-environment.php
### STAGING ENVIRONMENT CREATOR ###
Enter a valid local domain name: local.phpmyadmin.biz
Enter a valid directory in the filesystem for the DocumentRoot: /home/maurizio/phpmyadmin/
Enter a valid PHP version (5.6, 7.1, 7.2, 7.3, 7.4, 8.0 or 8.1): 7.4
Do you need HTTPS support (yes/no/y/n) ? y

Ora, bisogna modificare il file hosts di Windows per inserire il puntamento locale al dominio local.phpmyadmin.biz. Per farlo, modificare il file C:\Windows\System32\drivers\etc\hosts aggiungendo la regola 127.0.0.1 local.phpmyadmin.biz.

Dopodichè, aprire una command line di Windows in modalità privilegiata e lanciare ipconfig /flushdns

Fatto! Ora è possibile navigare sul proprio browser all'indirizzo https://local.phpmyadmin.biz/setup/ per proseguire il setup go PhpMyAdmin.

Per creare altri VirtualHost per altri progetti, utilizzare sempre le stesse istruzioni seguite per il setup di PhpMyAdmin. Basterà far puntare il VirtualHost alla directory giusta del proprio progetto, e definire un nome di dominio fittizio che sarà reindirizzato via HOSTS verso 127.0.0.1

Ottimizzare l'esperienza Linux - Step 4

Per ottimizzare l'installazione LAMP e l'esperienza utente sulla console dei comandi di Linux, seguire questi passaggi:

  1. Seguire le istruzioni di installazione di https://github.com/slomkowski/bash-full-of-colors

2. Lanciare wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash per installare NVM (per sviluppo NodeJS/React)

  1. Lanciare cd ~/utils/ && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && php composer-setup.php && php -r "unlink('composer-setup.php');" per installare una versione locale di composer all'interno della directory /utils/
  2. Creare una coppia di chiavi pubblica/privata con il comando ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/nome_chiave -C "utente@computer"
  3. Comunicare il contenuto della chiave pubblica al proprio team, che la userà per esempio per abilitare l'accesso ad un repository GIT privato.
  4. Copia-incollare il contenuto dello snippet bash_local all'interno di ~/.bash_local modificando la variabile $NOME_UTENTE con il nome dell'utente scelto

Note importanti:

  1. E' possibile fare il reset della macchina Linux con il comando wslrestart che è stato aliasato in ~/.bash_local. Così facendo si resetta completamente il sottosistema WSL2.
  2. Ogni volta che si esegue il login alla macchina virtuale, bisognerà lanciare il comando ~/lamp.sh per avviare i servizi Apache, PHP-FPM e Mysql. Questo è necessario perchè l'ambiente LAMP non è stato installato come servizio di sistema (per intenderci, con systemd).

Installare VS Code per accedere ai file di progetto su WSL2 - Step 5

VS Code è totalmente integrato e compatibile con WSL2, nativamente.

Questo incrementa la produttività e semplifica tantissimo lo sviluppo.

Per installare e configurare VS Code con WSL2 è sufficiente:

  1. Installare VS Code scaricandolo da https://code.visualstudio.com/
  2. Aprire VS Code e premere la combinazione di comandi CTRL + SHIFT + x
  3. Installare l'estensione Remote - WSL
  4. Riavviare VS Code
  5. Aprire una console di Ubuntu, e portarsi su una directory a piacere, ad esempio ~/utils/
  6. Lanciare il comando code . e lasciare che il sistema installi quello che gli serve
  7. Voilà, ora è possibile modificare i file presenti su Ubuntu direttamente da VS Code!

Ottimizzare lo sviluppo web con le estensioni giuste di VS Code - Step 6

Portarsi su una console di Ubuntu e lanciare questi comandi:

  1. cd ~/
  2. mkdir .composer && cd .composer/
  3. nano composer.json e inserire questo contenuto all'interno:
{
    "require": {
        "squizlabs/php_codesniffer": "^3.5",
        "friendsofphp/php-cs-fixer": "^2.16"
    }
}
  1. Lanciare composer install
  2. Ora abbiamo a disposizione i binari di php-cs-fixer e php codesniffer, ci serviranno per la config di VS Code
  3. Aprire VS Code, e portarsi su un progetto residente dentro Ubuntu per rimanere in "modalità WSL2"
  4. Premere CTRL + SHIFT + x, cercare php cs fixer e installare la versione del plugin di junstyle (https://github.com/junstyle/vscode-php-cs-fixer.git)
  5. Installare le seguenti estensioni: GitLens (Eric Amodio, https://github.com/eamodio/vscode-gitlens), Git History (Don Jayamanne, https://github.com/DonJayamanne/gitHistoryVSCode), PHP Intelephense (Ben Mewburn, https://github.com/bmewburn/vscode-intelephense), Prettier - Code Formatter (Prettier, https://github.com/prettier/prettier-vscode), PHP DocBlocker (Nail Brayfield, https://github.com/neild3r/vscode-php-docblocker), Twig Language (mblode, https://github.com/mblode/vscode-twig-language), markdownlint (David Anson, https://github.com/DavidAnson/vscode-markdownlint)
  6. Installare il seguente pacchetto icone: Material Icon Theme (Philipp Kief, https://github.com/PKief/vscode-material-icon-theme)
  7. Premere la combinazione di tasti CTRL + SHIFT + p, digitare preferenze, e cliccare su Preferenze: Apri Impostazioni (JSON)
  8. Copia-incollare la configurazione riportata nello snippet vscode-json-config

Contenuto dello snippet "vscode-json-config"

Ovviamente bisogna modificare la path di php-cs-fixer.executablePath secondo il proprio nome utente.

{
    "window.menuBarVisibility": "toggle",
    "window.zoomLevel": 0.2,
    "explorer.confirmDelete": false,
    "explorer.confirmDragAndDrop": false,
    "workbench.iconTheme": "material-icon-theme",
    "workbench.colorTheme": "Quiet Light",
    "workbench.colorCustomizations": {
        "editorCursor.foreground": "#444"
    },
    "workbench.editor.showTabs": true,
    "terminal.integrated.fontFamily": "monospace",
    "terminal.integrated.lineHeight": 0.8,
    "terminal.integrated.enableBell": false,
    "terminal.integrated.letterSpacing": -0.1,
    "terminal.integrated.fontSize": 16,
    "editor.fontWeight": "600",
    "editor.cursorStyle": "line",
    "editor.cursorBlinking": "phase",
    "editor.rulers": [130],
    "editor.formatOnSave": true,
    "editor.minimap.enabled": false,
    "editor.wordWrap": "on",
    "editor.insertSpaces": true,
    "editor.tabSize": 4,
    "html.format.contentUnformatted": "pre,code,textarea",
    "html.format.endWithNewline": false,
    "html.format.extraLiners": "head, body, /html",
    "html.format.indentHandlebars": false,
    "html.format.indentInnerHtml": false,
    "html.format.maxPreserveNewLines": null,
    "html.format.preserveNewLines": true,
    "html.format.wrapLineLength": 130,
    "html.format.wrapAttributes": "auto",
    "telemetry.enableCrashReporter": false,
    "telemetry.enableTelemetry": false,
    "prettier.trailingComma": "all",
    "prettier.endOfLine": "auto",
    "prettier.singleQuote": true,
    "prettier.useTabs": true,
    "prettier.tabWidth": 4,
    "prettier.printWidth": 130,
    "prettier.jsxBracketSameLine": true,
    "prettier.semi": false,
    "[php]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "junstyle.php-cs-fixer"
    },
    "[js]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[javascript]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[css]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[jsx]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[twig]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "mblode.twig-language"
    },
    "php.suggest.basic": false,
    "php.validate.enable": true,
    "typescript.updateImportsOnFileMove.enabled": "never",
    "git.enableSmartCommit": true,
    "git.autofetch": true,
    "git.confirmSync": false,
    "php-cs-fixer.executablePath": "/home/$NOME_UTENTE/.composer/vendor/bin/php-cs-fixer",
    "php-cs-fixer.executablePathWindows": "", //eg: php-cs-fixer.bat
    "php-cs-fixer.onsave": false,
    "php-cs-fixer.rules": "@PSR2",
    "php-cs-fixer.config": ".php_cs;.php_cs.dist",
    "php-cs-fixer.allowRisky": false,
    "php-cs-fixer.pathMode": "override",
    "php-cs-fixer.exclude": [],
    "php-cs-fixer.autoFixByBracket": true,
    "php-cs-fixer.autoFixBySemicolon": false,
    "php-cs-fixer.formatHtml": false,
    "php-cs-fixer.documentFormattingProvider": true,
    "php-cs-fixer.lastDownload": 0,
    "[html]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "php-docblocker.returnGap": true,
    "php-docblocker.qualifyClassNames": true,
    "php-docblocker.author": {
        "name": "NOME SVILUPPATORE",
        "email": "[email protected]"
    },
    "diffEditor.ignoreTrimWhitespace": false
}

Contenuto dello snippet ".bash_local"

alias casa="cd /home/$NOME_UTENTE"
alias composer="/usr/bin/php7.4 -d allow_url_fopen=1 /home/$NOME_UTENTE/utils/composer.phar"
alias php="/usr/bin/php7.4 -d allow_url_fopen=1 -d memory_limit=1024M"
alias php74="/usr/bin/php7.4 -d allow_url_fopen=1 -d memory_limit=1024M"
alias apt="sudo apt-get"
alias ls="ls -lash --color=auto --group-directories-first"
alias cd..="cd .."
alias ..="cd ../../"
alias ...="cd ../../../"
alias ....="cd ../../../../"
alias .....="cd ../../../../"
alias .4="cd ../../../../"
alias .5="cd ../../../../.."
alias ports="sudo netstat -tulanp"
alias wslrestart="history -a && cmd.exe /C wsl --shutdown"
alias tic="git"
alias npmclean="npm ci"
alias npmcheck="ncu"

gitremove() {
    git branch -d "$@"
    git push origin --delete "$@"
}

hugefiles() {
    du -a "$@" | sort -n -r | head -n 100
}

hugedirs() {
    cd "$@" && du -hsx -- * | sort -rh | head -100
}

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

Contenuto dello script "lamp.sh"

#!/usr/bin/env bash
echo "### Starting MYSQL 8 ..."
sudo service mysql start
echo "### Starting PHP-FPM 5.6, 7.*, 8.*"
[ -d /var/run/php/ ] || sudo mkdir /var/run/php/
sudo service php5.6-fpm start
sudo service php7.0-fpm start
sudo service php7.1-fpm start
sudo service php7.2-fpm start
sudo service php7.3-fpm start
sudo service php7.4-fpm start
sudo service php8.0-fpm start
sudo service php8.1-fpm start
echo "### Starting Apache Server ..."
sudo service apache2 start

Contenuto dello script "create-staging-environment.php"

IMPORTANTE: Dopo il copia-incolla in create-staging-environment.php, ricordarsi di modificare le stringhe ##NOME_UTENTE## in modo che contengano il nome utente scelto in fase di setup di Ubuntu..

<?php

if (php_sapi_name() !== "cli") {
    message('ERROR: This script can only be run from the CLI.', 'e');
    exit();
}

if (posix_getuid() !== 0) {
    message('ERROR: This script can only be run as ROOT or sudo.', 'e');
    exit();
}

if (!is_dir('/etc/apache2/certs2/')) {
    message('ERROR: You need to create the directory /etc/apache2/certs2/ as root prior of executing this script.', 'e');
    exit();
}

define('APACHE_SITES_AVAILABLE_DIR', '/etc/apache2/sites-available/');
define('APACHE_CERTS_DIR', '/etc/apache2/certs2/');
define('APACHE_CERT_SELFSIGNED_SCRIPT', './create-ssl-cert.sh');
define('PHP_FPM_CONFIG_DIR', '/etc/php/#VER#/fpm/pool.d/');
define('APACHE_MAX_CONF_INDEX', getApacheSitesAvailableMaxIndex());

message('### STAGING ENVIRONMENT CREATOR ###');

// 1. ask for the local domain name
$work = true;
while ($work) {
    $domain = readline('Enter a valid local domain name: ');
    $domain = strtolower(str_replace(['http://', 'https://', 'www.'], '', $domain));
    if (filter_var('http://' . $domain, FILTER_VALIDATE_URL)) {
        $work = false;
        define('DOMAIN', $domain);
    } else {
        message('Error. Retry.', 'e');
    }
}

// 2. ask for the local directory that will be served as the DocumentRoot
$work = true;
while ($work) {
    $document_root = readline('Enter a valid directory in the filesystem for the DocumentRoot: ');
    if (is_dir($document_root)) {
        $work = false;
        define('DOCUMENT_ROOT', rtrim($document_root, '/'));
    } else {
        message('Error. Retry.', 'e');
    }
}

// 3. ask for the PHP version for PHP-FPM
$work = true;
while ($work) {
    $php_version = readline('Enter a valid PHP version (5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0 or 8.1): ');
    if (in_array($php_version, ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1'])) {
        $work = false;
        define('PHPVER', $php_version);
    } else {
        message('Error. Retry.', 'e');
    }
}

// 4. ask for HTTPS support
$work = true;
while ($work) {
    $https_support = readline('Do you need HTTPS support (yes/no/y/n) ? ');
    if (in_array(strtolower($https_support), ['yes', 'no', 'y', 'n'])) {
        $work = false;
        if (in_array(strtolower($https_support), ['yes', 'y'])) {
            define('HTTPS_SUPPORT', true);
        } else {
            define('HTTPS_SUPPORT', false);
        }
    } else {
        message('Error. Retry.', 'e');
    }
}

// 5. perform actions
$apache_conf_stream = getApacheConf();
$php_fpm_conf_stream = getPhpFpmConf();
$apache_conf_file = APACHE_SITES_AVAILABLE_DIR . APACHE_MAX_CONF_INDEX . '-' . DOMAIN . '.conf';
$php_fpm_conf_file = str_replace('#VER#', PHPVER, PHP_FPM_CONFIG_DIR) . DOMAIN . '.conf';

if (file_put_contents($apache_conf_file, $apache_conf_stream)) {
    message('Apache configuration written correctly, going to enable the website', 's');
    exec('a2ensite ' . basename($apache_conf_file));

    if (file_put_contents($php_fpm_conf_file, $php_fpm_conf_stream)) {
        message('PHP-FPM configuration written successfully', 's');

        if (HTTPS_SUPPORT) {
            message('Going to CD into ' . APACHE_CERTS_DIR);
            exec('cd ' . APACHE_CERTS_DIR);
            message('Going to call the self-signed cert script ' . APACHE_CERT_SELFSIGNED_SCRIPT . ' with domain "' . DOMAIN . '"');
            exec(APACHE_CERT_SELFSIGNED_SCRIPT . ' ' . DOMAIN);
        }

        message('Going to exec "service apache2 force-reload"');
        exec('service apache2 force-reload');
        message('Going to exec "service php' . PHPVER . '-fpm restart"');
        exec('service php' . PHPVER . '-fpm restart');
    } else {
        message('Cannot write PHP-FPM configuration', 'e');
    }
} else {
    message('Cannot write Apache configuration', 'e');
}

function message(string $string, string $type = 'i')
{
    switch ($type) {
        case 'e': //error
            echo "\033[31m$string \033[0m\n";
        break;
        case 's': //success
            echo "\033[32m$string \033[0m\n";
        break;
        case 'w': //warning
            echo "\033[33m$string \033[0m\n";
        break;
        case 'i': //info
            echo "\033[36m$string \033[0m\n";
        break;
        default:
            echo "$string\n";
        break;
    }
}

function getApacheSitesAvailableMaxIndex() : string
{
    $files = glob(APACHE_SITES_AVAILABLE_DIR . '*.conf');
    if ($files && count($files) > 0) {
        $max_index = 0;
        foreach ($files as $file) {
            $file = basename($file);
            if (preg_match('/^([0-9]+).*\.conf$/ui', $file, $matches)) {
                $index = intval($matches[1]);
                if ($index >= $max_index) {
                    $max_index = $index;
                }
            }
        }

        return str_pad($max_index + 1, 3, '0', STR_PAD_LEFT);
    }

    return '001';
}

function getApacheConf()
{
    $domain = DOMAIN;
    $document_root = DOCUMENT_ROOT;
    $phpver = PHPVER;
    $newline = "\\n";

    $conf_http = <<<HTML
<VirtualHost 127.0.0.1:80>
    ServerName $domain
    ServerAlias www.$domain
    DocumentRoot $document_root
    ServerAdmin [email protected]
    UseCanonicalName Off
    Options -ExecCGI -Includes
    RemoveHandler cgi-script .cgi .pl .plx .ppl .perl
    CustomLog \${APACHE_LOG_DIR}/$domain combined
    CustomLog \${APACHE_LOG_DIR}/$domain-bytes_log "%{%s}t %I .$newline%{%s}t %O ."

    # Enable HTTP2
    Protocols h2 http/1.1

    <FilesMatch \.php$>
        # Apache 2.4.10+ can proxy to unix socket
        SetHandler "proxy:unix:/var/run/php/php$phpver-fpm-$domain.sock|fcgi://localhost/"
    </FilesMatch>

    <IfModule mod_brotli.c>
        AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript application/json application/x-font-ttf application/vnd.ms-fontobject image/x-icon
    </IfModule>

    <Directory $document_root/>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        order allow,deny
        allow from all
        Require all granted
    </Directory>

    ##AUTOREWRITE##
</VirtualHost>

HTML;

    $conf_https = <<<HTML
<IfModule mod_ssl.c>
    <VirtualHost 127.0.0.1:443>
        ServerName $domain
        ServerAlias www.$domain
        DocumentRoot $document_root
        ServerAdmin [email protected]
        UseCanonicalName Off
        Options -ExecCGI -Includes
        RemoveHandler cgi-script .cgi .pl .plx .ppl .perl
        CustomLog \${APACHE_LOG_DIR}/ssl-$domain combined
        CustomLog \${APACHE_LOG_DIR}/ssl-$domain-bytes_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

        # Enable HTTP2
        Protocols h2 http/1.1

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>

        <Directory $document_root/>
            Options -Indexes +FollowSymLinks
            AllowOverride All
            order allow,deny
            allow from all
            Require all granted
        </Directory>

        <IfModule mod_brotli.c>
            AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript application/json application/x-font-ttf application/vnd.ms-fontobject image/x-icon
        </IfModule>

        <FilesMatch \.php$>
            # Apache 2.4.10+ can proxy to unix socket
            SetHandler "proxy:unix:/var/run/php/php$phpver-fpm-$domain.sock|fcgi://localhost/"
        </FilesMatch>

        SSLEngine on
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
        SSLCertificateFile "/etc/apache2/certs2/$domain.crt"
        SSLCertificateKeyFile "/etc/apache2/certs2/$domain.key"
    </VirtualHost>
</IfModule>

HTML;

    if (HTTPS_SUPPORT) {
        return str_replace(
            '##AUTOREWRITE##',
            'RewriteEngine On
            RewriteCond %{HTTPS} off
            RewriteRule ^/(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]',
            $conf_http
        ) . chr(10) . chr(10) . $conf_https;
    } else {
        return str_replace('##AUTOREWRITE##', '', $conf_http);
    }
}

function getPhpFpmConf()
{
    $domain = DOMAIN;
    $document_root = DOCUMENT_ROOT;
    $phpver = PHPVER;

    $php_fpm_conf = <<<HTML
[$domain]
user = ##NOME_UTENTE##
group = ##NOME_UTENTE##
listen = /var/run/php/php$phpver-fpm-$domain.sock
listen.owner = ##NOME_UTENTE##
listen.group = ##NOME_UTENTE##
php_admin_value[disable_functions] = apache_child_terminate,apache_get_modules,apache_getenv,apache_note,apache_setenv,define_syslog_variables,disk_free_space,diskfreespace,dl,fpassthru,get_current_user,getmyuid,highlight_file,passthru,pclose,pcntl_exec,pfsockopen,php_uname,pcntl_alarm,pcntl_fork,pcntl_get_last_error,pcntl_signal,pcntl_getpriority,pcntl_setpriority,pcntl_strerror,pcntl_signal_dispatch,pcntl_sigprocmask,pcntl_waitpid,pcntl_wait,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_wexitstatus,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,popen,show_source,socket_select,socket_strerror,stream_select,syslog,symlink
php_admin_flag[allow_url_fopen] = off
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /

catch_workers_output = yes
php_flag[display_errors] = off
php_admin_value[error_log] = $document_root/php$phpver-fpm-errors.log
php_admin_flag[log_errors] = on
php_admin_value[post_max_size] = 128M
php_admin_value[upload_max_filesize] = 128M
php_admin_value[memory_limit] = 1024M
php_value[memory_limit] = 1024M
php_value[short_open_tag] =  On

HTML;

    return $php_fpm_conf;
}

Contenuto dello script "create-ssl-cert.sh"

#!/usr/bin/env bash

# Ask for the base domain
BASE_DOMAIN="$1"
if [ -z "$BASE_DOMAIN" ]; then
  echo "Usage: $(basename $0) <domain>"
  exit 11
fi

fail_if_error() {
  [ $1 != 0 ] && {
    unset PASSPHRASE
    exit 10
  }
}

# Generate a passphrase
export PASSPHRASE=$(head -c 500 /dev/urandom | tr -dc a-z0-9A-Z | head -c 128; echo)

# Days for the cert to live
DAYS=3650

# Generated configuration file
CONFIG_FILE="config.txt"

cat > $CONFIG_FILE <<-EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
x509_extensions = v3_req
distinguished_name = dn

[dn]
C = IT
ST = Italy
L = Torino
O = Acme Corp
OU = The Dev Team
emailAddress = webmaster@$BASE_DOMAIN
CN = $BASE_DOMAIN

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.$BASE_DOMAIN
DNS.2 = $BASE_DOMAIN
EOF

# The file name can be anything
FILE_NAME="$BASE_DOMAIN"

# Remove previous keys
echo "Removing existing certs like $FILE_NAME.*"
if ls /etc/apache2/certs2/$FILE_NAME.* 1> /dev/null 2>&1; then
  rm -rf /etc/apache2/certs2/$FILE_NAME.*
fi

echo "Generating certs for $BASE_DOMAIN"

# Generate our Private Key, CSR and Certificate
# Use SHA-2 as SHA-1 is unsupported from Jan 1, 2017

openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout "/etc/apache2/certs2/$FILE_NAME.key" -days $DAYS -out "/etc/apache2/certs2/$FILE_NAME.crt" -passin pass:$PASSPHRASE -config "$CONFIG_FILE"

# OPTIONAL - write an info to see the details of the generated crt
openssl x509 -noout -fingerprint -text < "/etc/apache2/certs2/$FILE_NAME.crt" > "/etc/apache2/certs2/$FILE_NAME.info"

# Protect the key
chmod 400 "/etc/apache2/certs2/$FILE_NAME.key"

# Remove the config file
rm -f $CONFIG_FILE

Contenuto del file di config Mysql "mysqld.conf"

Questo file è riportato per comodità. Non è necessario usarlo, ma è fortemente consigliato nel caso si abbia a disposizione una macchina con almenot 16GB di RAM.

#
# The MySQL database server configuration file.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

[mysqld]
#
# * Basic Settings
#
user            = mysql
# pid-file      = /var/run/mysqld/mysqld.pid
# socket        = /var/run/mysqld/mysqld.sock
# port          = 3306
# datadir       = /var/lib/mysql


# If MySQL is running as a replication slave, this should be
# changed. Ref https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmpdir
# tmpdir                = /tmp
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1
skip-networking
sql_mode=NO_ENGINE_SUBSTITUTION
default-authentication-plugin=mysql_native_password
collation-server = utf8_unicode_ci
character-set-server = utf8
#
# * Fine Tuning
#
# sort_buffer_size        = 256000000 (orig)
# key_buffer_size               = 16M (orig)
# max_allowed_packet    = 64M
# thread_stack          = 256K

# thread_cache_size       = -1

# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover-options  = BACKUP

# my fine tuning
max_connections          = 20
table_open_cache         = 2048
thread_stack             = 32M
thread_cache_size        = 8
max_allowed_packet       = 16M
max_heap_table_size      = 128M
binlog_cache_size        = 2M
sort_buffer_size         = 16M
join_buffer_size         = 16M
tmp_table_size           = 128M
key_buffer_size          = 512M
read_buffer_size         = 4M
read_rnd_buffer_size     = 32M
bulk_insert_buffer_size  = 64M
myisam_sort_buffer_size  = 128M
innodb_buffer_pool_size  = 2G
innodb_lock_wait_timeout = 150



# table_open_cache       = 4000

#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
#
# Log all queries
# Be aware that this log type is a performance killer.
# general_log_file        = /var/log/mysql/query.log
# general_log             = 1
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Here you can see queries with especially long duration
# slow_query_log                = 1
# slow_query_log_file   = /var/log/mysql/mysql-slow.log
# long_query_time = 2
# log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
# server-id             = 1
# log_bin                       = /var/log/mysql/mysql-bin.log
# binlog_expire_logs_seconds    = 2592000
max_binlog_size   = 100M
# binlog_do_db          = include_database_name
# binlog_ignore_db      = include_database_name
Ultima modifica: Giovedì 25 Agosto 2022, alle 17:59
Attenzione! Questo contenuto è potenzialmente inaccuratoQuesto articolo risale al 2017: le informazioni e i consigli tecnici riportati potrebbero essere diventati obsoleti nel corso del tempo.

Da qualche giorno è online un nuovo sito sviluppato da Maurizio Fonte in collaborazione con Polarity Bit.

Questo sito è un ecommerce di abbigliamento personalizzato, richiesto da una azienda artigiana delle colline di Asti, e costruito su misura per il loro business model.

Vestilogo - Abbigliamento Personalizzato si propone come alternativa professionale per tutti coloro che intendono acquistare vestiti con loghi stampati o ricamati. Questa azienda fa del ricamo il suo punto di forza, realizzando dei prodotti finiti di qualità eccelsa., utilizzando solo abbigliamento della massima qualità da marchi come Fruit of the Loom, Payper, Stedman.

Già fornitrice di svariate grosse realtà italiane, tra cui Ferrero e Juventus, il marchio Vestilogo - Stampe e Ricami su T-Shirt diventerà il punto di riferimento italiano per quanto riguarda la qualità dei prodotti realizzati.

image


Ultima modifica: Martedì 2 Mag 2017, alle 19:54